Compare commits
22 Commits
tilintarka
...
kalenterik
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f02a4b7359 | ||
| f81cc8a5fe | |||
|
|
aa327b7a4b | ||
|
|
c679d184a9 | ||
|
|
e250b03cc0 | ||
|
|
06989eb867 | ||
|
|
fc858d1159 | ||
|
|
0c179c7e28 | ||
|
|
7102d6f9e8 | ||
|
|
1d191d13ae | ||
|
|
55b59913d7 | ||
|
|
599264b212 | ||
|
|
3411949313 | ||
|
|
e2d517a310 | ||
|
|
c561b9859f | ||
|
|
779c73a906 | ||
|
|
732e43d6af | ||
|
|
fe58ce7484 | ||
|
|
a0be6c2c85 | ||
|
|
705280283c | ||
|
|
9cb04480b5 | ||
|
|
45f1f44498 |
@ -9,12 +9,14 @@
|
||||
General changes in the hledger project.
|
||||
For package-specific changes, see the hledger package changelogs.
|
||||
|
||||
# 991e5a836
|
||||
# 1.27 2022-09-01
|
||||
|
||||
Docs
|
||||
|
||||
- https://hledger.org/ERRORS.html - an overview of hledger's error messages.
|
||||
|
||||
- Rewrite/consolidate cost and conversion docs.
|
||||
|
||||
- New template for github releases, with improved install instructions for binaries.
|
||||
|
||||
- Add modern windows binary install instructions. (Lazar Lazarov, Simon Michael)
|
||||
|
||||
204
RELEASING.md
204
RELEASING.md
@ -79,37 +79,57 @@ Here are some definitions, useful eg when executing or automating release proced
|
||||
| *master* | The branch named `master` in the hledger repo; the main line of hledger development. Pull requests are usually relative to this. |
|
||||
| *release branch* | Branches named `MA.JOR-branch` in the hledger repo, eg `1.25-branch`. Releases and release previews are always made from a release branch. |
|
||||
|
||||
|
||||
## Activities
|
||||
Release manager activities/responsibilities include:
|
||||
- **Software** - selecting changes, packages, release dates; coordinating contributions; ensuring release readiness
|
||||
- **Branch Management** - coordinating main and release branch, local and remote repos, CI branches
|
||||
- **Version Bumping** - choosing and applying new version numbers and related things like tags, github releases, urls, ghc and dep versions, stackage resolvers, everywhere needed
|
||||
- **Docs** - command help, manuals, changelogs, release notes, github release notes, install page, install scripts, announcements, process docs
|
||||
- **Testing** - local testing, CI testing, extra release-specific testing
|
||||
- **Artifacts** - generating binaries, zip files, github releases etc.
|
||||
- **Publishing** - uploading, pushing, making visible, finalising
|
||||
- **Announcing** - various announcement stages and channels
|
||||
|
||||
These have complex interdependencies and sequencing constraints. Chunk, separate, routinise, document and automate them as far as possible.
|
||||
|
||||
## General tips
|
||||
- Update changelogs early and often, eg during/after a PR, to spread the work.
|
||||
See also [CHANGELOGS](CHANGELOGS.html).
|
||||
- Release (or practice releasing) often.
|
||||
- Follow RELEASING.md's procedures if helpful. Update a copy (RELEASING2.md) while releasing.
|
||||
- The release process continually evolves. Don't document procedures in too much detail / prematurely.
|
||||
- Make things a little better each time through: simpler, more reliable, better documented, more automated, easier, faster, cheaper, higher quality.
|
||||
- Make releases from a release branch, not from master. Use the tools/release script.
|
||||
- Before publishing a github release: prepare binaries, release notes, announcements, and tag.
|
||||
- Before tagging: make binaries for all platforms, from the same commit.
|
||||
- Before making binaries: do all possible pre-tagging steps and try to get everything finalised. (Binaries' --version shows their git hash, and this should match the release tag.)
|
||||
|
||||
## Procedures
|
||||
|
||||
### 0. General tips
|
||||
- Release (or practice releasing) often.
|
||||
- Release responsibilities include:
|
||||
- **Software** - selecting changes, packages, release dates; coordinating contributions; ensuring release readiness
|
||||
- **Branch Management** - coordinating main and release branch, local and remote repos, CI branches
|
||||
- **Version Bumping** - choosing and applying new version numbers and related things like tags, github releases, urls, ghc and dep versions, stackage resolvers, everywhere needed
|
||||
- **Docs** - command help, manuals, changelogs, release notes, github release notes, install page, install scripts, announcements, process docs
|
||||
- **Testing** - local testing, CI testing, extra release-specific testing
|
||||
- **Artifacts** - generating binaries, zip files, github releases etc.
|
||||
- **Publishing** - uploading, pushing, making visible, finalising
|
||||
- **Announcing** - various announcement stages and channels
|
||||
- These have complex interdependencies and sequencing constraints. Chunk, separate, routinise, document and automate them as far as possible.
|
||||
- Don't document in too much detail prematurely.
|
||||
- Follow RELEASING.md's procedures when helpful, ignore them when not.
|
||||
- As step 1, save it as RELEASING2.md and make changes there until after release.
|
||||
- Make things a little better each time through: simpler, more reliable, better documented, more automated, easier, faster, cheaper, higher quality.
|
||||
- Update [CHANGELOGS](CHANGELOGS.html) early and often, eg during/after a PR, to spread the work.
|
||||
- Make releases from a release branch, not from master.
|
||||
- Before making binaries: try to do all possible pre-release-tag steps. (Binaries' --version shows their git hash, and it should match the release tag.)
|
||||
- Before tagging: make binaries for all platforms, from the same commit.
|
||||
|
||||
### 1. Preview release
|
||||
### Do a release
|
||||
- save RELEASING.md as RELEASING2.md
|
||||
- [check release readiness](#check-release-readiness)
|
||||
- [prepare release branch](#prepare-release-branch)
|
||||
- [make binaries](#make-binaries)
|
||||
- start making draft binaries: push to `origin/binaries`, resolve failures
|
||||
- update changelogs: see CHANGELOGS.md
|
||||
- [make release notes](#make-release-notes)
|
||||
- choose version: MA.JOR, MA.JOR.MINOR, or MA.JOR.MINOR.FIXUP
|
||||
- [prepare release branch](#prepare-release-branch) (preview/major release)
|
||||
or cherry pick changes from master (bugfix/fixup release)
|
||||
- [make new manuals](#make-new-manuals) (major release)
|
||||
- [update hledger-install](#update-hledger-install) (major/bugfix/fixup release)
|
||||
- [update install page](#update-install-page) (major/bugfix/fixup release)
|
||||
- [make announcement](#make-announcement) (major/bugfix release)
|
||||
- [tag the release](#tag-the-release)
|
||||
- [push to github](#push-to-github)
|
||||
- [make github release](#make-github-release)
|
||||
- [update master from release branch](#update-master-from-release-branch)
|
||||
- [make release binaries](#make-release-binaries)
|
||||
- [make github release](#make-github-release) draft
|
||||
- upload to hackage: `make hackageupload` (major/bugfix/fixup release)
|
||||
- publish github release
|
||||
- publish website changes: manuals, release notes, install page
|
||||
- [announce release](#announce-release) (major/bugfix release)
|
||||
- move RELEASING2 updates back to RELEASING, commit
|
||||
- [cherry-pick release branch to master](#cherry-pick-release-branch-to-master)
|
||||
- bump master to next version: `./Shake setversion A.BB.99` (major release)
|
||||
|
||||
#### Check release readiness
|
||||
- master's changelogs are up to date (see [CHANGELOGS](CHANGELOGS.html))
|
||||
@ -124,6 +144,20 @@ Here are some definitions, useful eg when executing or automating release proced
|
||||
- commit any changes (msg: `tools: shake`)
|
||||
- appropriate timing, release manager availability
|
||||
|
||||
#### Make release notes
|
||||
In site repo:
|
||||
|
||||
- update `src/release-notes.md`
|
||||
- copy template, uncomment
|
||||
- replace date
|
||||
- replace XX with NEW
|
||||
- add new changelog sections, excluding hledger-lib
|
||||
- remove any empty sections
|
||||
- add contributors, `git shortlog -sn OLD..NEW`
|
||||
- add summary (major release) or remove it (bugfix release)
|
||||
- check preview in vs code
|
||||
- commit: `relnotes: NEW`
|
||||
|
||||
#### Prepare release branch
|
||||
- `PAUSE=1 ECHO=1 tools/release prep MA.JOR[.99.PREVIEWNUM]` (eg 1.24.99.1 for 1.25 preview 1)
|
||||
(XXX seems to go wrong without PAUSE`)
|
||||
@ -144,65 +178,14 @@ Here are some definitions, useful eg when executing or automating release proced
|
||||
- `stack exec -- hledger --version`, check version
|
||||
- `stack exec -- hledger help | tail`, check version & date
|
||||
|
||||
#### Make binaries
|
||||
- `tools/release bin`
|
||||
- get all platforms built on the same commit
|
||||
- download binary artifact zip files
|
||||
|
||||
#### Tag the release
|
||||
- `make tag`
|
||||
|
||||
#### Push to github
|
||||
- `git push origin MA.JOR-branch && git push --tags`
|
||||
- or in magit: `P p`, `P t`
|
||||
|
||||
#### Make github release
|
||||
- copy text from previous similar release, https://github.com/simonmichael/hledger/releases
|
||||
- create new release, https://github.com/simonmichael/hledger/releases/new
|
||||
- select release tag (MA.JOR[...])
|
||||
- set title (MA.JOR[...])
|
||||
- paste & replace with new release notes
|
||||
- upload CI binaries
|
||||
- save as draft
|
||||
- github release testing (preview)
|
||||
- publish
|
||||
|
||||
#### Update master from release branch
|
||||
- switch back to master
|
||||
- update master changelogs, merging final release changelog entries (see [CHANGELOGS](CHANGELOGS.html))
|
||||
- cherry-pick other useful changes, such as `;doc: ANNOUNCE`
|
||||
- after a major release: bump master to new dev version (`./Shake setversion -c A.B.99`)
|
||||
|
||||
### 2. Major release
|
||||
- [make release notes](#make-release-notes)
|
||||
- [make announcement](#make-announcement)
|
||||
- [update hledger-install](#update-hledger-install)
|
||||
- prepare as for [preview release](#1-preview-release)
|
||||
- [update install page](#update-install-page)
|
||||
- [add manuals to website](#add-manuals-to-website)
|
||||
- [announce major release](#announce-major-release)
|
||||
|
||||
#### Make release notes
|
||||
#### Make new manuals
|
||||
In site repo:
|
||||
|
||||
- update `src/release-notes.md`
|
||||
- copy template, uncomment
|
||||
- replace date
|
||||
- replace XX with NEW
|
||||
- add new changelog sections, excluding hledger-lib
|
||||
- remove any empty sections
|
||||
- add contributors, `git shortlog -sn OLD..NEW`
|
||||
- add summary (major release) or remove it (bugfix release)
|
||||
- check preview in vs code
|
||||
- commit: `relnotes: NEW`
|
||||
|
||||
#### Make announcement
|
||||
In release branch:
|
||||
|
||||
- update `doc/ANNOUNCE` (major release)
|
||||
- summary, contributors from release notes
|
||||
- any other edits
|
||||
- commit: `;doc: announce`
|
||||
- js/site.js: add NEW, update currentrelease
|
||||
- Makefile: add NEW, two places
|
||||
- make snapshot-NEW (after ensuring main repo has been release-tagged)
|
||||
- commit: `current, makefile, site.js: NEW`
|
||||
- push
|
||||
|
||||
#### Update hledger-install
|
||||
- update `hledger-install/hledger-install.sh`
|
||||
@ -230,16 +213,35 @@ In site repo:
|
||||
- Total count from `make functest`
|
||||
- commit: `download: NEW`
|
||||
|
||||
#### Add new manuals to website
|
||||
In site repo:
|
||||
#### Make announcement
|
||||
In release branch:
|
||||
|
||||
- js/site.js: add NEW, update currentrelease
|
||||
- Makefile: add NEW, two places
|
||||
- make snapshot-NEW (after ensuring main repo has been release-tagged)
|
||||
- commit: `makefile, js: update for NEW`
|
||||
- push
|
||||
- update `doc/ANNOUNCE` (major release)
|
||||
- summary, contributors from release notes
|
||||
- any other edits
|
||||
- commit: `;doc: announce`
|
||||
|
||||
#### Announce major release
|
||||
#### Tag the release
|
||||
- `make tag`
|
||||
|
||||
#### Make release binaries
|
||||
- `tools/release bin`
|
||||
- get all platforms built on the same commit
|
||||
- download binary artifact zip files
|
||||
|
||||
#### Make github release
|
||||
- `git push origin MA.JOR-branch && git push --tags` (or magit `P p`, `P t`)
|
||||
- copy text from previous similar release, https://github.com/simonmichael/hledger/releases
|
||||
- create new release, https://github.com/simonmichael/hledger/releases/new
|
||||
- select release tag (MA.JOR[...])
|
||||
- set title (MA.JOR[...])
|
||||
- paste & replace with new release notes
|
||||
- upload CI binaries
|
||||
- save as draft
|
||||
- github release testing: preview on github, upload to hackage
|
||||
- publish
|
||||
|
||||
#### Announce release
|
||||
- pause; take a break afk; check time and energy
|
||||
- push main repo
|
||||
- push site repo
|
||||
@ -263,17 +265,13 @@ In site repo:
|
||||
- update last release date on plaintextaccounting.org
|
||||
<!-- - toot at https://fosstodon.org/web/accounts/106304084994827771 ? -->
|
||||
|
||||
### 3. Fixup release
|
||||
- switch to release branch
|
||||
- cherry pick changes from master
|
||||
- proceed as above, with MA.JOR.MINOR.FIXUP
|
||||
#### Cherry-pick release branch to master
|
||||
- switch back to master
|
||||
- update master changelogs, merging final release changelog entries (see [CHANGELOGS](CHANGELOGS.html))
|
||||
- cherry-pick other useful changes, such as `;doc: ANNOUNCE`
|
||||
- after a major release: bump master to new dev version (`./Shake setversion -c A.B.99`)
|
||||
|
||||
### 4. Bugfix release
|
||||
- switch to release branch
|
||||
- cherry pick changes from master
|
||||
- proceed as above, with MA.JOR.MINOR
|
||||
|
||||
### 5. After a release
|
||||
### Do post-release followup
|
||||
- monitor packaging status, update install page
|
||||
- docker - expect/merge PR
|
||||
- homebrew - expect badge to update soon
|
||||
@ -283,7 +281,7 @@ In site repo:
|
||||
- prepare followup releases if needed
|
||||
- update process docs and tools
|
||||
|
||||
### Packaging
|
||||
### Update packaging
|
||||
|
||||
#### Update homebrew formula
|
||||
|
||||
|
||||
43
doc/ANNOUNCE
43
doc/ANNOUNCE
@ -1,29 +1,38 @@
|
||||
Aloha! I am pleased to announce hledger 1.26:
|
||||
I'm pleased to announce hledger 1.27 !
|
||||
|
||||
https://github.com/simonmichael/hledger/releases/1.26
|
||||
https://github.com/simonmichael/hledger/releases/1.27
|
||||
https://hledger.org/install
|
||||
https://hledger.org/release-notes.html#hledger-1-26
|
||||
https://hledger.org/release-notes.html#hledger-1-27
|
||||
|
||||
1.26 is a modest maintenance release; highlights include
|
||||
faster register reports and clearer error messages.
|
||||
Highlights include inferring costs from equity postings,
|
||||
new error checks, and improved error messages.
|
||||
|
||||
Thank you to core contributor Stephen Morgan.
|
||||
Thank you to release contributors
|
||||
Stephen Morgan,
|
||||
Alex Hirzel,
|
||||
Pranesh Prakash,
|
||||
David D Lowe,
|
||||
Charlotte Van Petegem,
|
||||
Max Thomas,
|
||||
Andrew Lelechenko.
|
||||
|
||||
What is hledger ?
|
||||
|
||||
- free, high quality Plain Text Accounting[1] software:
|
||||
- a fast and robust multicurrency double-entry accounting system
|
||||
- built around human-readable, version-controllable plain text files
|
||||
- inspired by and partly compatible with Ledger CLI[2]
|
||||
- convertible to and from Beancount[3]
|
||||
- written in Haskell for correctness and longevity
|
||||
- easy to install on unix, mac and windows.
|
||||
- Fast, reliable, free, multicurrency, double-entry, plain text
|
||||
accounting[1] software that runs on unix, mac, windows, and the web
|
||||
|
||||
For help getting started, or more info, see https://hledger.org,
|
||||
and join our chat via Matrix or IRC: https://hledger.org/support.
|
||||
Newcomers, experts, contributors, sponsors, feedback are always welcome!
|
||||
- Built around human-readable, version-controllable plain text files
|
||||
|
||||
Best wishes,
|
||||
- Inspired by and largely compatible with Ledger CLI[2];
|
||||
convertible to and from Beancount[3]
|
||||
|
||||
- Written in Haskell for correctness and longevity.
|
||||
|
||||
For help getting started, or more info, see https://hledger.org
|
||||
and join our chat via Matrix or IRC: https://hledger.org/support
|
||||
Newcomers, experts, contributors, sponsors, feedback are welcome!
|
||||
|
||||
Aloha,
|
||||
-Simon
|
||||
|
||||
|
||||
|
||||
@ -119,12 +119,8 @@ Problems:
|
||||
</details>
|
||||
|
||||
## Next steps
|
||||
Once installed, you could try these quick starts / tutorials:
|
||||
|
||||
- https://hledger.org/index.html#how-to-get-started
|
||||
- https://hledger.org/add.html
|
||||
- https://hledger.org/ui.html
|
||||
- https://hledger.org/web.html
|
||||
- [Getting Started](https://hledger.org/start.html)
|
||||
|
||||
|
||||
<!--
|
||||
|
||||
@ -46,7 +46,7 @@ HERE
|
||||
HLEDGER_INSTALL_TOOL=hledger-install.sh
|
||||
|
||||
# this script's version
|
||||
HLEDGER_INSTALL_VERSION=20220711
|
||||
HLEDGER_INSTALL_VERSION=20220918
|
||||
|
||||
# stackage snapshot to use when installing with stack.
|
||||
# You can try specifying a different stackage version here, or
|
||||
@ -70,10 +70,10 @@ hledger-stockquotes \
|
||||
|
||||
# Latest hledger package versions.
|
||||
# Don't forget to also bump HLEDGER_INSTALL_VERSION above.
|
||||
HLEDGER_LIB_VERSION=1.26.1
|
||||
HLEDGER_VERSION=1.26.1
|
||||
HLEDGER_UI_VERSION=1.26.1
|
||||
HLEDGER_WEB_VERSION=1.26.1
|
||||
HLEDGER_LIB_VERSION=1.27.1
|
||||
HLEDGER_VERSION=1.27.1
|
||||
HLEDGER_UI_VERSION=1.27.1
|
||||
HLEDGER_WEB_VERSION=1.27.1
|
||||
# addons:
|
||||
HLEDGER_IADD_VERSION=1.3.17
|
||||
HLEDGER_INTEREST_VERSION=1.6.4
|
||||
|
||||
@ -1,2 +1,2 @@
|
||||
m4_dnl Date to show in man pages. Updated by "Shake manuals"
|
||||
m4_define({{_monthyear_}}, {{August 2022}})m4_dnl
|
||||
m4_define({{_monthyear_}}, {{September 2022}})m4_dnl
|
||||
|
||||
@ -1 +1 @@
|
||||
1.26.99
|
||||
1.27.1
|
||||
|
||||
@ -1,2 +1,2 @@
|
||||
m4_dnl Version number to show in manuals. Updated by "Shake setversion"
|
||||
m4_define({{_version_}}, {{1.26.99}})m4_dnl
|
||||
m4_define({{_version_}}, {{1.27.1}})m4_dnl
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
Internal/api/developer-ish changes in the hledger-lib (and hledger) packages.
|
||||
For user-visible changes, see the hledger package changelog.
|
||||
|
||||
# 6d4563001
|
||||
# 1.27 2022-09-01
|
||||
|
||||
Breaking changes
|
||||
|
||||
|
||||
@ -89,7 +89,7 @@ data PeriodicReport a b =
|
||||
} deriving (Show, Functor, Generic, ToJSON)
|
||||
|
||||
instance Bifunctor PeriodicReport where
|
||||
bimap f g pr = pr{prRows = map (bimap f g) $ prRows pr, prTotals = fmap g $ prTotals pr}
|
||||
bimap f g pr = pr{prRows = map (bimap f g) $ prRows pr, prTotals = g <$> prTotals pr}
|
||||
|
||||
data PeriodicReportRow a b =
|
||||
PeriodicReportRow
|
||||
|
||||
@ -5,7 +5,7 @@ cabal-version: 1.12
|
||||
-- see: https://github.com/sol/hpack
|
||||
|
||||
name: hledger-lib
|
||||
version: 1.26.99
|
||||
version: 1.27.1
|
||||
synopsis: A reusable library providing the core functionality of hledger
|
||||
description: A reusable library containing hledger's core functionality.
|
||||
This is used by most hledger* packages so that they support the same
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
name: hledger-lib
|
||||
version: 1.26.99
|
||||
version: 1.27.1
|
||||
synopsis: A reusable library providing the core functionality of hledger
|
||||
description: |
|
||||
A reusable library containing hledger's core functionality.
|
||||
|
||||
@ -1,2 +1,2 @@
|
||||
m4_dnl Date to show in man pages. Updated by "Shake manuals"
|
||||
m4_define({{_monthyear_}}, {{August 2022}})m4_dnl
|
||||
m4_define({{_monthyear_}}, {{September 2022}})m4_dnl
|
||||
|
||||
@ -1 +1 @@
|
||||
1.26.99
|
||||
1.27.1
|
||||
|
||||
@ -1,2 +1,2 @@
|
||||
m4_dnl Version number to show in manuals. Updated by "Shake setversion"
|
||||
m4_define({{_version_}}, {{1.26.99}})m4_dnl
|
||||
m4_define({{_version_}}, {{1.27.1}})m4_dnl
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
User-visible changes in hledger-ui.
|
||||
See also the hledger changelog.
|
||||
|
||||
# b46cb8a7f
|
||||
# 1.27 2022-09-01
|
||||
|
||||
Improvements
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
|
||||
.TH "HLEDGER-UI" "1" "August 2022" "hledger-ui-1.26.99 " "hledger User Manuals"
|
||||
.TH "HLEDGER-UI" "1" "September 2022" "hledger-ui-1.27 " "hledger User Manuals"
|
||||
|
||||
|
||||
|
||||
@ -7,7 +7,7 @@
|
||||
.PP
|
||||
hledger-ui is a terminal interface (TUI) for the hledger accounting
|
||||
tool.
|
||||
This manual is for hledger-ui 1.26.99.
|
||||
This manual is for hledger-ui 1.27.
|
||||
.SH SYNOPSIS
|
||||
.PP
|
||||
\f[C]hledger-ui [OPTIONS] [QUERYARGS]\f[R]
|
||||
|
||||
@ -5,7 +5,7 @@ cabal-version: 1.12
|
||||
-- see: https://github.com/sol/hpack
|
||||
|
||||
name: hledger-ui
|
||||
version: 1.26.99
|
||||
version: 1.27.1
|
||||
synopsis: Curses-style terminal interface for the hledger accounting system
|
||||
description: A simple curses-style terminal user interface for the hledger accounting system.
|
||||
It can be a more convenient way to browse your accounts than the CLI.
|
||||
@ -63,7 +63,7 @@ executable hledger-ui
|
||||
hs-source-dirs:
|
||||
./
|
||||
ghc-options: -Wall -Wno-incomplete-uni-patterns -Wno-missing-signatures -Wno-orphans -Wno-type-defaults -Wno-unused-do-bind
|
||||
cpp-options: -DVERSION="1.26.99"
|
||||
cpp-options: -DVERSION="1.27.1"
|
||||
build-depends:
|
||||
ansi-terminal >=0.9
|
||||
, async
|
||||
@ -78,8 +78,8 @@ executable hledger-ui
|
||||
, extra >=1.6.3
|
||||
, filepath
|
||||
, fsnotify >=0.2.1.2 && <0.4
|
||||
, hledger >=1.26.99 && <1.27
|
||||
, hledger-lib >=1.26.99 && <1.27
|
||||
, hledger >=1.27.1 && <1.28
|
||||
, hledger-lib >=1.27.1 && <1.28
|
||||
, megaparsec >=7.0.0 && <9.3
|
||||
, microlens >=0.4
|
||||
, microlens-platform >=0.2.3.1
|
||||
|
||||
@ -12,7 +12,7 @@ hledger-ui(1)
|
||||
*************
|
||||
|
||||
hledger-ui is a terminal interface (TUI) for the hledger accounting
|
||||
tool. This manual is for hledger-ui 1.26.99.
|
||||
tool. This manual is for hledger-ui 1.27.
|
||||
|
||||
'hledger-ui [OPTIONS] [QUERYARGS]'
|
||||
'hledger ui -- [OPTIONS] [QUERYARGS]'
|
||||
@ -640,34 +640,34 @@ program is restarted.
|
||||
|
||||
Tag Table:
|
||||
Node: Top221
|
||||
Node: OPTIONS1657
|
||||
Ref: #options1755
|
||||
Node: MOUSE6637
|
||||
Ref: #mouse6732
|
||||
Node: KEYS7014
|
||||
Ref: #keys7107
|
||||
Node: SCREENS11193
|
||||
Ref: #screens11291
|
||||
Node: Accounts screen11381
|
||||
Ref: #accounts-screen11509
|
||||
Node: Register screen13848
|
||||
Ref: #register-screen14003
|
||||
Node: Transaction screen15987
|
||||
Ref: #transaction-screen16145
|
||||
Node: Error screen17015
|
||||
Ref: #error-screen17137
|
||||
Node: TIPS17381
|
||||
Ref: #tips17480
|
||||
Node: Watch mode17532
|
||||
Ref: #watch-mode17649
|
||||
Node: Watch mode limitations18399
|
||||
Ref: #watch-mode-limitations18540
|
||||
Node: ENVIRONMENT19676
|
||||
Ref: #environment19787
|
||||
Node: FILES21172
|
||||
Ref: #files21271
|
||||
Node: BUGS21484
|
||||
Ref: #bugs21561
|
||||
Node: OPTIONS1654
|
||||
Ref: #options1752
|
||||
Node: MOUSE6634
|
||||
Ref: #mouse6729
|
||||
Node: KEYS7011
|
||||
Ref: #keys7104
|
||||
Node: SCREENS11190
|
||||
Ref: #screens11288
|
||||
Node: Accounts screen11378
|
||||
Ref: #accounts-screen11506
|
||||
Node: Register screen13845
|
||||
Ref: #register-screen14000
|
||||
Node: Transaction screen15984
|
||||
Ref: #transaction-screen16142
|
||||
Node: Error screen17012
|
||||
Ref: #error-screen17134
|
||||
Node: TIPS17378
|
||||
Ref: #tips17477
|
||||
Node: Watch mode17529
|
||||
Ref: #watch-mode17646
|
||||
Node: Watch mode limitations18396
|
||||
Ref: #watch-mode-limitations18537
|
||||
Node: ENVIRONMENT19673
|
||||
Ref: #environment19784
|
||||
Node: FILES21169
|
||||
Ref: #files21268
|
||||
Node: BUGS21481
|
||||
Ref: #bugs21558
|
||||
|
||||
End Tag Table
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@ HLEDGER-UI(1) hledger User Manuals HLEDGER-UI(1)
|
||||
|
||||
NAME
|
||||
hledger-ui is a terminal interface (TUI) for the hledger accounting
|
||||
tool. This manual is for hledger-ui 1.26.99.
|
||||
tool. This manual is for hledger-ui 1.27.
|
||||
|
||||
SYNOPSIS
|
||||
hledger-ui [OPTIONS] [QUERYARGS]
|
||||
@ -549,4 +549,4 @@ SEE ALSO
|
||||
|
||||
|
||||
|
||||
hledger-ui-1.26.99 August 2022 HLEDGER-UI(1)
|
||||
hledger-ui-1.27 September 2022 HLEDGER-UI(1)
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
name : hledger-ui
|
||||
version : 1.26.99
|
||||
version : 1.27.1
|
||||
synopsis : Curses-style terminal interface for the hledger accounting system
|
||||
description : |
|
||||
A simple curses-style terminal user interface for the hledger accounting system.
|
||||
@ -38,7 +38,7 @@ flags:
|
||||
manual: false
|
||||
default: true
|
||||
|
||||
cpp-options: -DVERSION="1.26.99"
|
||||
cpp-options: -DVERSION="1.27.1"
|
||||
|
||||
ghc-options:
|
||||
- -Wall
|
||||
@ -50,8 +50,8 @@ ghc-options:
|
||||
|
||||
dependencies:
|
||||
- base >=4.14 && <4.17
|
||||
- hledger-lib >=1.26.99 && <1.27
|
||||
- hledger >=1.26.99 && <1.27
|
||||
- hledger-lib >=1.27.1 && <1.28
|
||||
- hledger >=1.27.1 && <1.28
|
||||
- ansi-terminal >=0.9
|
||||
- async
|
||||
- breakpoint
|
||||
|
||||
@ -1,2 +1,2 @@
|
||||
m4_dnl Date to show in man pages. Updated by "Shake manuals"
|
||||
m4_define({{_monthyear_}}, {{August 2022}})m4_dnl
|
||||
m4_define({{_monthyear_}}, {{September 2022}})m4_dnl
|
||||
|
||||
@ -1 +1 @@
|
||||
1.26.99
|
||||
1.27.1
|
||||
|
||||
@ -1,2 +1,2 @@
|
||||
m4_dnl Version number to show in manuals. Updated by "Shake setversion"
|
||||
m4_define({{_version_}}, {{1.26.99}})m4_dnl
|
||||
m4_define({{_version_}}, {{1.27.1}})m4_dnl
|
||||
|
||||
@ -9,7 +9,7 @@ __ _____| |__
|
||||
User-visible changes in hledger-web.
|
||||
See also the hledger changelog.
|
||||
|
||||
# c97e05e0d
|
||||
# 1.27 2022-09-01
|
||||
|
||||
Improvements
|
||||
|
||||
@ -29,6 +29,7 @@ Fixes
|
||||
|
||||
- Respect the add form's file selector again.
|
||||
(Simon Michael, Kerstin, #1229)
|
||||
|
||||
# 1.26.1 2022-07-11
|
||||
|
||||
- Uses hledger 1.26.1.
|
||||
|
||||
@ -154,6 +154,7 @@ instance Yesod App where
|
||||
|]
|
||||
addScript $ StaticR js_bootstrap_min_js
|
||||
addScript $ StaticR js_bootstrap_datepicker_min_js
|
||||
addScript $ StaticR js_locales_bootstrap_datepicker_fi_min_js
|
||||
addScript $ StaticR js_jquery_url_js
|
||||
addScript $ StaticR js_jquery_cookie_js
|
||||
addScript $ StaticR js_jquery_hotkeys_js
|
||||
|
||||
@ -31,7 +31,7 @@ postAddR :: Handler ()
|
||||
postAddR = do
|
||||
checkServerSideUiEnabled
|
||||
VD{caps, j, today} <- getViewData
|
||||
when (CapAdd `notElem` caps) (permissionDenied "Missing the 'add' capability")
|
||||
when (CapAdd `notElem` caps) (permissionDenied "Ei oikeutta lisätä kirjauksia ('add')")
|
||||
|
||||
((res, view), enctype) <- runFormPost $ addForm j today
|
||||
case res of
|
||||
@ -40,7 +40,7 @@ postAddR = do
|
||||
liftIO $ do
|
||||
ensureJournalFileExists f
|
||||
appendToJournalFileOrStdout f (showTransaction t')
|
||||
setMessage "Transaction added."
|
||||
setMessage "Kirjaus lisätty."
|
||||
redirect JournalR
|
||||
FormMissing -> showForm view enctype
|
||||
FormFailure errs -> do
|
||||
@ -49,7 +49,7 @@ postAddR = do
|
||||
where
|
||||
showForm view enctype =
|
||||
sendResponse =<< defaultLayout [whamlet|
|
||||
<h2>Add transaction
|
||||
<h2>Uusi kirjaus
|
||||
<div .row style="margin-top:1em">
|
||||
<form#addform.form.col-xs-12.col-sm-11 method=post enctype=#{enctype}>
|
||||
^{view}
|
||||
@ -60,7 +60,7 @@ postAddR = do
|
||||
putAddR :: Handler RepJson
|
||||
putAddR = do
|
||||
VD{caps, j, opts} <- getViewData
|
||||
when (CapAdd `notElem` caps) (permissionDenied "Missing the 'add' capability")
|
||||
when (CapAdd `notElem` caps) (permissionDenied "Ei oikeutta lisätä kirjauksia ('add')")
|
||||
|
||||
(r :: Result Transaction) <- parseCheckJsonBody
|
||||
case r of
|
||||
|
||||
@ -32,20 +32,20 @@ postEditR :: FilePath -> Handler ()
|
||||
postEditR f = do
|
||||
checkServerSideUiEnabled
|
||||
VD {caps, j} <- getViewData
|
||||
when (CapManage `notElem` caps) (permissionDenied "Missing the 'manage' capability")
|
||||
when (CapManage `notElem` caps) (permissionDenied "Ei oikeutta muokata kirjanpitoa ('manage')")
|
||||
|
||||
(f', txt) <- journalFile404 f j
|
||||
((res, view), enctype) <- runFormPost (editForm f' txt)
|
||||
newtxt <- fromFormSuccess (showForm view enctype) res
|
||||
runExceptT (writeJournalTextIfValidAndChanged f newtxt) >>= \case
|
||||
Left e -> do
|
||||
setMessage $ "Failed to load journal: " <> toHtml e
|
||||
setMessage $ "Kirjanpidon lataaminen epäonnistui: " <> toHtml e
|
||||
showForm view enctype
|
||||
Right () -> do
|
||||
setMessage $ "Saved journal " <> toHtml f <> "\n"
|
||||
setMessage $ "Kirjanpito tallennettu tiedostoon " <> toHtml f <> "\n"
|
||||
redirect JournalR
|
||||
where
|
||||
showForm view enctype =
|
||||
sendResponse <=< defaultLayout $ do
|
||||
setTitle "Edit journal"
|
||||
setTitle "Muokkaa kirjanpitoa"
|
||||
[whamlet|<form method=post enctype=#{enctype}>^{view}|]
|
||||
|
||||
@ -21,16 +21,16 @@ getJournalR :: Handler Html
|
||||
getJournalR = do
|
||||
checkServerSideUiEnabled
|
||||
VD{caps, j, m, opts, q, qopts, today} <- getViewData
|
||||
when (CapView `notElem` caps) (permissionDenied "Missing the 'view' capability")
|
||||
when (CapView `notElem` caps) (permissionDenied "Ei oikeutta katsella kirjanpitoa ('view')")
|
||||
let title = case inAccount qopts of
|
||||
Nothing -> "General Journal"
|
||||
Just (a, inclsubs) -> "Transactions in " <> a <> if inclsubs then "" else " (excluding subaccounts)"
|
||||
title' = title <> if m /= Any then ", filtered" else ""
|
||||
Nothing -> "Kaikki kirjaukset"
|
||||
Just (a, inclsubs) -> "Tapahtumat tilillä " <> a <> if inclsubs then "" else " (poislukien alatilit)"
|
||||
title' = title <> if m /= Any then ", suodatettu" else ""
|
||||
acctlink a = (RegisterR, [("q", replaceInacct q $ accountQuery a)])
|
||||
rspec = (reportspec_ $ cliopts_ opts){_rsQuery = m}
|
||||
items = reverse $ entriesReport rspec j
|
||||
transactionFrag = transactionFragment j
|
||||
|
||||
defaultLayout $ do
|
||||
setTitle "journal - hledger-web"
|
||||
setTitle "päiväkirja - hledger-web"
|
||||
$(widgetFile "journal")
|
||||
|
||||
@ -39,16 +39,16 @@ getManageR :: Handler Html
|
||||
getManageR = do
|
||||
checkServerSideUiEnabled
|
||||
VD{caps, j} <- getViewData
|
||||
when (CapManage `notElem` caps) (permissionDenied "Missing the 'manage' capability")
|
||||
when (CapManage `notElem` caps) (permissionDenied "Ei oikeutta muokata kirjanpitoa ('manage')")
|
||||
defaultLayout $ do
|
||||
setTitle "Manage journal"
|
||||
setTitle "Muokkaa kirjanpitoa"
|
||||
$(widgetFile "manage")
|
||||
|
||||
getDownloadR :: FilePath -> Handler TypedContent
|
||||
getDownloadR f = do
|
||||
checkServerSideUiEnabled
|
||||
VD{caps, j} <- getViewData
|
||||
when (CapManage `notElem` caps) (permissionDenied "Missing the 'manage' capability")
|
||||
when (CapManage `notElem` caps) (permissionDenied "Ei oikeutta muokata kirjanpitoa ('manage')")
|
||||
(f', txt) <- journalFile404 f j
|
||||
addHeader "Content-Disposition" ("attachment; filename=\"" <> T.pack f' <> "\"")
|
||||
sendResponse ("text/plain" :: ByteString, toContent txt)
|
||||
@ -58,49 +58,49 @@ getDownloadR f = do
|
||||
getVersionR :: Handler TypedContent
|
||||
getVersionR = do
|
||||
VD{caps} <- getViewData
|
||||
when (CapView `notElem` caps) (permissionDenied "Missing the 'view' capability")
|
||||
when (CapView `notElem` caps) (permissionDenied "Ei oikeutta katsella kirjanpitoa ('view')")
|
||||
selectRep $ do
|
||||
provideJson $ packageversion
|
||||
|
||||
getAccountnamesR :: Handler TypedContent
|
||||
getAccountnamesR = do
|
||||
VD{caps, j} <- getViewData
|
||||
when (CapView `notElem` caps) (permissionDenied "Missing the 'view' capability")
|
||||
when (CapView `notElem` caps) (permissionDenied "Ei oikeutta katsella kirjanpitoa ('view')")
|
||||
selectRep $ do
|
||||
provideJson $ journalAccountNames j
|
||||
|
||||
getTransactionsR :: Handler TypedContent
|
||||
getTransactionsR = do
|
||||
VD{caps, j} <- getViewData
|
||||
when (CapView `notElem` caps) (permissionDenied "Missing the 'view' capability")
|
||||
when (CapView `notElem` caps) (permissionDenied "Ei oikeutta katsella kirjanpitoa ('view')")
|
||||
selectRep $ do
|
||||
provideJson $ jtxns j
|
||||
|
||||
getPricesR :: Handler TypedContent
|
||||
getPricesR = do
|
||||
VD{caps, j} <- getViewData
|
||||
when (CapView `notElem` caps) (permissionDenied "Missing the 'view' capability")
|
||||
when (CapView `notElem` caps) (permissionDenied "Ei oikeutta katsella kirjanpitoa ('view')")
|
||||
selectRep $ do
|
||||
provideJson $ map priceDirectiveToMarketPrice $ jpricedirectives j
|
||||
|
||||
getCommoditiesR :: Handler TypedContent
|
||||
getCommoditiesR = do
|
||||
VD{caps, j} <- getViewData
|
||||
when (CapView `notElem` caps) (permissionDenied "Missing the 'view' capability")
|
||||
when (CapView `notElem` caps) (permissionDenied "Ei oikeutta katsella kirjanpitoa ('view')")
|
||||
selectRep $ do
|
||||
provideJson $ (M.keys . jinferredcommodities) j
|
||||
|
||||
getAccountsR :: Handler TypedContent
|
||||
getAccountsR = do
|
||||
VD{caps, j} <- getViewData
|
||||
when (CapView `notElem` caps) (permissionDenied "Missing the 'view' capability")
|
||||
when (CapView `notElem` caps) (permissionDenied "Ei oikeutta katsella kirjanpitoa ('view')")
|
||||
selectRep $ do
|
||||
provideJson $ laccounts $ ledgerFromJournal Any j
|
||||
|
||||
getAccounttransactionsR :: Text -> Handler TypedContent
|
||||
getAccounttransactionsR a = do
|
||||
VD{caps, j} <- getViewData
|
||||
when (CapView `notElem` caps) (permissionDenied "Missing the 'view' capability")
|
||||
when (CapView `notElem` caps) (permissionDenied "Ei oikeutta katsella kirjanpitoa ('view')")
|
||||
let
|
||||
rspec = defreportspec
|
||||
thisacctq = Acct $ accountNameToAccountRegex a -- includes subs
|
||||
|
||||
@ -27,11 +27,11 @@ getRegisterR :: Handler Html
|
||||
getRegisterR = do
|
||||
checkServerSideUiEnabled
|
||||
VD{caps, j, m, opts, q, qopts, today} <- getViewData
|
||||
when (CapView `notElem` caps) (permissionDenied "Missing the 'view' capability")
|
||||
when (CapView `notElem` caps) (permissionDenied "Ei oikeutta katsella kirjanpitoa ('view')")
|
||||
|
||||
let (a,inclsubs) = fromMaybe ("all accounts",True) $ inAccount qopts
|
||||
s1 = if inclsubs then "" else " (excluding subaccounts)"
|
||||
s2 = if m /= Any then ", filtered" else ""
|
||||
let (a,inclsubs) = fromMaybe ("kaikki tilit",True) $ inAccount qopts
|
||||
s1 = if inclsubs then "" else " (poislukien alitilit)"
|
||||
s2 = if m /= Any then ", suodatettu" else ""
|
||||
header = a <> s1 <> s2
|
||||
|
||||
let rspec = reportspec_ (cliopts_ opts)
|
||||
@ -47,12 +47,12 @@ getRegisterR = do
|
||||
tail $ (", "<$xs) ++ [""]
|
||||
items = accountTransactionsReport rspec{_rsQuery=m} j acctQuery
|
||||
balancelabel
|
||||
| isJust (inAccount qopts), balanceaccum_ (_rsReportOpts rspec) == Historical = "Historical Total"
|
||||
| isJust (inAccount qopts) = "Period Total"
|
||||
| otherwise = "Total"
|
||||
| isJust (inAccount qopts), balanceaccum_ (_rsReportOpts rspec) == Historical = "Historiallinen saldo"
|
||||
| isJust (inAccount qopts) = "Kauden saldo"
|
||||
| otherwise = "Saldo"
|
||||
transactionFrag = transactionFragment j
|
||||
defaultLayout $ do
|
||||
setTitle "register - hledger-web"
|
||||
setTitle "kirjaukset - hledger-web"
|
||||
$(widgetFile "register")
|
||||
|
||||
-- cf. Hledger.Reports.AccountTransactionsReport.accountTransactionsReportItems
|
||||
|
||||
@ -36,7 +36,7 @@ postUploadR :: FilePath -> Handler ()
|
||||
postUploadR f = do
|
||||
checkServerSideUiEnabled
|
||||
VD {caps, j} <- getViewData
|
||||
when (CapManage `notElem` caps) (permissionDenied "Missing the 'manage' capability")
|
||||
when (CapManage `notElem` caps) (permissionDenied "Ei oikeutta muokata kirjanpitoa ('manage')")
|
||||
|
||||
(f', _) <- journalFile404 f j
|
||||
((res, view), enctype) <- runFormPost (uploadForm f')
|
||||
@ -48,20 +48,20 @@ postUploadR f = do
|
||||
newtxt <- case TE.decodeUtf8' lbs of
|
||||
Left e -> do
|
||||
setMessage $
|
||||
"Encoding error: '" <> toHtml (show e) <> "'. " <>
|
||||
"If your file is not UTF-8 encoded, try the 'edit form', " <>
|
||||
"where the transcoding should be handled by the browser."
|
||||
"Merkistövirhe: '" <> toHtml (show e) <> "'. " <>
|
||||
"Jos tiedostosi ei käytä UTF-8 merkistöä, kokeile 'muokkaa'-sivua," <>
|
||||
"jolla selaimesi pitäisi huolehtia merkistön muuntamisesta puolestasi."
|
||||
showForm view enctype
|
||||
Right newtxt -> return newtxt
|
||||
runExceptT (writeJournalTextIfValidAndChanged f newtxt) >>= \case
|
||||
Left e -> do
|
||||
setMessage $ "Failed to load journal: " <> toHtml e
|
||||
setMessage $ "Kirjanpidon lataaminen epäonnistui: " <> toHtml e
|
||||
showForm view enctype
|
||||
Right () -> do
|
||||
setMessage $ "File " <> toHtml f <> " uploaded successfully"
|
||||
setMessage $ "Tiedoston " <> toHtml f <> " lataaminen onnistui!"
|
||||
redirect JournalR
|
||||
where
|
||||
showForm view enctype =
|
||||
sendResponse <=< defaultLayout $ do
|
||||
setTitle "Upload journal"
|
||||
setTitle "Korvaa tiedosto"
|
||||
[whamlet|<form method=post enctype=#{enctype}>^{view}|]
|
||||
|
||||
@ -38,7 +38,7 @@ addModal addR j today = do
|
||||
<div .modal-content>
|
||||
<div .modal-header>
|
||||
<button type="button" .close data-dismiss="modal" aria-hidden="true">×
|
||||
<h3 .modal-title #addLabel>Add a transaction
|
||||
<h3 .modal-title #addLabel>Uusi kirjaus
|
||||
<div .modal-body>
|
||||
<form#addform.form action=@{addR} method=POST enctype=#{addEnctype}>
|
||||
^{addView}
|
||||
@ -49,14 +49,15 @@ addForm j today = identifyForm "add" $ \extra -> do
|
||||
let -- bindings used in add-form.hamlet
|
||||
descriptions = foldMap S.fromList [journalPayeesDeclaredOrUsed j, journalDescriptions j]
|
||||
files = fst <$> jfiles j
|
||||
deffile = journalFilePath j
|
||||
(dateRes, dateView) <- mreq dateField dateSettings Nothing
|
||||
(descRes, descView) <- mopt textField descSettings Nothing
|
||||
(acctsRes, _) <- mreq listField acctSettings Nothing
|
||||
(amtsRes, _) <- mreq listField amtSettings Nothing
|
||||
(fileRes, fileView) <- mreq fileField' fileSettings Nothing
|
||||
(fileRes, fileView) <- mopt fileField' fileSettings Nothing
|
||||
let
|
||||
(postingsRes, displayRows) = validatePostings acctsRes amtsRes
|
||||
formRes = validateTransaction dateRes descRes postingsRes fileRes
|
||||
formRes = validateTransaction deffile dateRes descRes postingsRes fileRes
|
||||
return (formRes, $(widgetFile "add-form"))
|
||||
where
|
||||
-- custom fields
|
||||
@ -79,29 +80,30 @@ addForm j today = identifyForm "add" $ \extra -> do
|
||||
| f `elem` fs = Right f
|
||||
| otherwise = Left $ MsgInputNotFound $ T.pack f
|
||||
-- field settings
|
||||
dateSettings = FieldSettings "date" Nothing Nothing (Just "date") [("class", "form-control input-lg"), ("placeholder", "Date")]
|
||||
descSettings = FieldSettings "desc" Nothing Nothing (Just "description") [("class", "form-control input-lg typeahead"), ("placeholder", "Description"), ("size", "40")]
|
||||
dateSettings = FieldSettings "date" Nothing Nothing (Just "date") [("class", "form-control input-lg"), ("placeholder", "Päiväys")]
|
||||
descSettings = FieldSettings "desc" Nothing Nothing (Just "description") [("class", "form-control input-lg typeahead"), ("placeholder", "Selite"), ("size", "40")]
|
||||
acctSettings = FieldSettings "account" Nothing Nothing (Just "account") []
|
||||
amtSettings = FieldSettings "amount" Nothing Nothing (Just "amount") []
|
||||
fileSettings = FieldSettings "file" Nothing Nothing (Just "file") [("class", "form-control input-lg")]
|
||||
|
||||
validateTransaction ::
|
||||
FormResult Day -> FormResult (Maybe Text) -> FormResult [Posting] -> FormResult FilePath
|
||||
FilePath -> FormResult Day -> FormResult (Maybe Text) -> FormResult [Posting] -> FormResult (Maybe FilePath)
|
||||
-> FormResult (Transaction, FilePath)
|
||||
validateTransaction dateRes descRes postingsRes fileRes =
|
||||
validateTransaction deffile dateRes descRes postingsRes fileRes =
|
||||
case makeTransaction <$> dateRes <*> descRes <*> postingsRes <*> fileRes of
|
||||
FormSuccess (txn,f) -> case balanceTransaction defbalancingopts txn of
|
||||
Left e -> FormFailure [T.pack e]
|
||||
Right txn' -> FormSuccess (txn',f)
|
||||
x -> x
|
||||
where
|
||||
makeTransaction date mdesc postings f =
|
||||
makeTransaction date mdesc postings mfile =
|
||||
(nulltransaction {
|
||||
tdate = date
|
||||
,tdescription = fromMaybe "" mdesc
|
||||
,tpostings = postings
|
||||
,tsourcepos = (initialPos f, initialPos f)
|
||||
}, f)
|
||||
where f = fromMaybe deffile mfile
|
||||
|
||||
-- | Parse a list of postings out of a list of accounts and a corresponding list
|
||||
-- of amounts
|
||||
@ -188,7 +190,8 @@ toBloodhoundJson ts =
|
||||
"]"
|
||||
]
|
||||
where
|
||||
b64wrap = ("atob(\""<>) . (<>"\")") . encodeBase64
|
||||
-- decodeBase64EncodedText is defined in add-form.hamlet
|
||||
b64wrap = ("decodeBase64EncodedText(\""<>) . (<>"\")") . encodeBase64
|
||||
|
||||
zipDefault :: a -> [a] -> [a] -> [(a, a)]
|
||||
zipDefault def (b:bs) (c:cs) = (b, c):(zipDefault def bs cs)
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
|
||||
.TH "HLEDGER-WEB" "1" "August 2022" "hledger-web-1.26.99 " "hledger User Manuals"
|
||||
.TH "HLEDGER-WEB" "1" "September 2022" "hledger-web-1.27 " "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.26.99.
|
||||
This manual is for hledger-web 1.27.
|
||||
.SH SYNOPSIS
|
||||
.PP
|
||||
\f[C]hledger-web [OPTIONS]\f[R]
|
||||
|
||||
@ -5,7 +5,7 @@ cabal-version: 1.12
|
||||
-- see: https://github.com/sol/hpack
|
||||
|
||||
name: hledger-web
|
||||
version: 1.26.99
|
||||
version: 1.27.1
|
||||
synopsis: Web-based user interface for the hledger accounting system
|
||||
description: A simple web-based user interface for the hledger accounting system,
|
||||
providing a more modern UI than the command-line or terminal interfaces.
|
||||
@ -92,6 +92,7 @@ extra-source-files:
|
||||
static/js/jquery.js
|
||||
static/js/jquery.min.js
|
||||
static/js/jquery.url.js
|
||||
static/js/locales/bootstrap-datepicker.fi.min.js
|
||||
static/js/typeahead.bundle.js
|
||||
static/js/typeahead.bundle.min.js
|
||||
templates/add-form.hamlet
|
||||
@ -151,7 +152,7 @@ library
|
||||
hs-source-dirs:
|
||||
./
|
||||
ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns
|
||||
cpp-options: -DVERSION="1.26.99"
|
||||
cpp-options: -DVERSION="1.27.1"
|
||||
build-depends:
|
||||
Decimal >=0.5.1
|
||||
, aeson >=1
|
||||
@ -172,8 +173,8 @@ library
|
||||
, extra >=1.6.3
|
||||
, filepath
|
||||
, hjsmin
|
||||
, hledger >=1.26.99 && <1.27
|
||||
, hledger-lib >=1.26.99 && <1.27
|
||||
, hledger >=1.27.1 && <1.28
|
||||
, hledger-lib >=1.27.1 && <1.28
|
||||
, hspec
|
||||
, http-client
|
||||
, http-conduit
|
||||
@ -213,7 +214,7 @@ executable hledger-web
|
||||
hs-source-dirs:
|
||||
app
|
||||
ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns
|
||||
cpp-options: -DVERSION="1.26.99"
|
||||
cpp-options: -DVERSION="1.27.1"
|
||||
build-depends:
|
||||
base >=4.14 && <4.17
|
||||
, breakpoint
|
||||
@ -234,7 +235,7 @@ test-suite test
|
||||
hs-source-dirs:
|
||||
test
|
||||
ghc-options: -Wall -Wredundant-constraints -Wincomplete-record-updates -Wincomplete-uni-patterns
|
||||
cpp-options: -DVERSION="1.26.99"
|
||||
cpp-options: -DVERSION="1.27.1"
|
||||
build-depends:
|
||||
base >=4.14 && <4.17
|
||||
, breakpoint
|
||||
|
||||
@ -12,7 +12,7 @@ hledger-web(1)
|
||||
**************
|
||||
|
||||
hledger-web is a web interface (WUI) for the hledger accounting tool.
|
||||
This manual is for hledger-web 1.26.99.
|
||||
This manual is for hledger-web 1.27.
|
||||
|
||||
'hledger-web [OPTIONS]'
|
||||
'hledger web -- [OPTIONS]'
|
||||
@ -632,22 +632,22 @@ awkward.
|
||||
|
||||
Tag Table:
|
||||
Node: Top223
|
||||
Node: OPTIONS1889
|
||||
Ref: #options1994
|
||||
Node: PERMISSIONS9905
|
||||
Ref: #permissions10044
|
||||
Node: EDITING UPLOADING DOWNLOADING11256
|
||||
Ref: #editing-uploading-downloading11437
|
||||
Node: RELOADING12271
|
||||
Ref: #reloading12405
|
||||
Node: JSON API12838
|
||||
Ref: #json-api12952
|
||||
Node: ENVIRONMENT18442
|
||||
Ref: #environment18558
|
||||
Node: FILES19869
|
||||
Ref: #files19969
|
||||
Node: BUGS20182
|
||||
Ref: #bugs20260
|
||||
Node: OPTIONS1886
|
||||
Ref: #options1991
|
||||
Node: PERMISSIONS9902
|
||||
Ref: #permissions10041
|
||||
Node: EDITING UPLOADING DOWNLOADING11253
|
||||
Ref: #editing-uploading-downloading11434
|
||||
Node: RELOADING12268
|
||||
Ref: #reloading12402
|
||||
Node: JSON API12835
|
||||
Ref: #json-api12949
|
||||
Node: ENVIRONMENT18439
|
||||
Ref: #environment18555
|
||||
Node: FILES19866
|
||||
Ref: #files19966
|
||||
Node: BUGS20179
|
||||
Ref: #bugs20257
|
||||
|
||||
End Tag Table
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@ HLEDGER-WEB(1) hledger User Manuals HLEDGER-WEB(1)
|
||||
|
||||
NAME
|
||||
hledger-web is a web interface (WUI) for the hledger accounting tool.
|
||||
This manual is for hledger-web 1.26.99.
|
||||
This manual is for hledger-web 1.27.
|
||||
|
||||
SYNOPSIS
|
||||
hledger-web [OPTIONS]
|
||||
@ -586,4 +586,4 @@ SEE ALSO
|
||||
|
||||
|
||||
|
||||
hledger-web-1.26.99 August 2022 HLEDGER-WEB(1)
|
||||
hledger-web-1.27 September 2022 HLEDGER-WEB(1)
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
name: hledger-web
|
||||
version: 1.26.99
|
||||
version: 1.27.1
|
||||
synopsis: Web-based user interface for the hledger accounting system
|
||||
description: |
|
||||
A simple web-based user interface for the hledger accounting system,
|
||||
@ -83,7 +83,7 @@ dependencies:
|
||||
|
||||
library:
|
||||
source-dirs: .
|
||||
cpp-options: -DVERSION="1.26.99"
|
||||
cpp-options: -DVERSION="1.27.1"
|
||||
exposed-modules:
|
||||
- Hledger.Web
|
||||
- Hledger.Web.Application
|
||||
@ -103,8 +103,8 @@ library:
|
||||
- Hledger.Web.Widget.AddForm
|
||||
- Hledger.Web.Widget.Common
|
||||
dependencies:
|
||||
- hledger-lib >=1.26.99 && <1.27
|
||||
- hledger >=1.26.99 && <1.27
|
||||
- hledger-lib >=1.27.1 && <1.28
|
||||
- hledger >=1.27.1 && <1.28
|
||||
- aeson >=1
|
||||
- base64
|
||||
- blaze-html
|
||||
@ -153,7 +153,7 @@ executables:
|
||||
hledger-web:
|
||||
source-dirs: app
|
||||
main: main.hs
|
||||
cpp-options: -DVERSION="1.26.99"
|
||||
cpp-options: -DVERSION="1.27.1"
|
||||
dependencies:
|
||||
- hledger-web
|
||||
when:
|
||||
@ -167,7 +167,7 @@ tests:
|
||||
source-dirs: test
|
||||
main: test.hs
|
||||
other-modules: [] # prevent double compilation, https://github.com/sol/hpack/issues/188
|
||||
cpp-options: -DVERSION="1.26.99"
|
||||
cpp-options: -DVERSION="1.27.1"
|
||||
dependencies:
|
||||
- hledger-lib
|
||||
- hledger
|
||||
|
||||
@ -14,6 +14,7 @@ $(document).ready(function() {
|
||||
autoclose: true,
|
||||
format: 'yyyy-mm-dd',
|
||||
todayHighlight: true,
|
||||
language: 'fi',
|
||||
weekStart: 1 // Monday
|
||||
});;
|
||||
|
||||
@ -109,11 +110,11 @@ function registerChart($container, series) {
|
||||
/* https://github.com/krzysu/flot.tooltip */
|
||||
tooltip: true,
|
||||
tooltipOpts: {
|
||||
xDateFormat: "%Y/%m/%d",
|
||||
xDateFormat: "%d.%m.%Y",
|
||||
content:
|
||||
function(label, x, y, flotitem) {
|
||||
var data = flotitem.series.data[flotitem.dataIndex];
|
||||
return data[3]+" balance on %x after "+data[2]+" posted by transaction:<pre>"+data[4]+"</pre>";
|
||||
return data[3]+" saldoa %x sen jälkeen, kun siirrettiin "+data[2]+" kirjauksella: <pre>"+data[4]+"</pre>";
|
||||
},
|
||||
onHover: function(flotitem, $tooltipel) {
|
||||
$tooltipel.css('border-color',flotitem.series.color);
|
||||
@ -193,8 +194,8 @@ function addformAddPosting() {
|
||||
$('#addform .account-postings').append( $('#addform .account-group:last').clone().addClass('added-row') );
|
||||
// renumber and clear the new last account and amount fields
|
||||
var n = $('#addform .account-group').length;
|
||||
$('.account-input:last').prop('placeholder', 'Account '+n).val('');
|
||||
$('.amount-input:last').prop('placeholder','Amount '+n).val(''); // XXX Enable typehead on dynamically created inputs
|
||||
$('.account-input:last').prop('placeholder', 'Tili '+n).val('');
|
||||
$('.amount-input:last').prop('placeholder','Summa '+n).val(''); // XXX Enable typehead on dynamically created inputs
|
||||
// and move the keypress handler to the new last amount field
|
||||
addformLastAmountBindKey();
|
||||
}
|
||||
|
||||
1
hledger-web/static/js/locales/bootstrap-datepicker.fi.min.js
vendored
Normal file
1
hledger-web/static/js/locales/bootstrap-datepicker.fi.min.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
!function(a){a.fn.datepicker.dates.fi={days:["sunnuntai","maanantai","tiistai","keskiviikko","torstai","perjantai","lauantai"],daysShort:["sun","maa","tii","kes","tor","per","lau"],daysMin:["su","ma","ti","ke","to","pe","la"],months:["tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu"],monthsShort:["tam","hel","maa","huh","tou","kes","hei","elo","syy","lok","mar","jou"],today:"tänään",clear:"Tyhjennä",weekStart:1,format:"d.m.yyyy"}}(jQuery);
|
||||
@ -19,6 +19,17 @@
|
||||
jQuery('input[name=description]').typeahead({ highlight: true }, { source: descriptionsSuggester.ttAdapter() });
|
||||
jQuery('input[name=account]').typeahead({ highlight: true }, { source: accountsSuggester.ttAdapter() });
|
||||
});
|
||||
|
||||
const utf8textdecoder = new TextDecoder();
|
||||
function decodeBase64EncodedText(b64) {
|
||||
const unb64 = window.atob(b64);
|
||||
const arr = new Uint8Array(unb64.length);
|
||||
for (let i = 0; i < arr.length; i++) {
|
||||
arr[i] = unb64.charCodeAt(i);
|
||||
}
|
||||
return utf8textdecoder.decode(arr);
|
||||
}
|
||||
|
||||
^{extra}
|
||||
|
||||
<div .row>
|
||||
@ -40,23 +51,23 @@
|
||||
<div .form-group .row .account-group style="padding-left:1em;">
|
||||
<div .col-sm-9.col-xs-9 :isJust accE:.has-error>
|
||||
<input .account-input.form-control.input-lg.typeahead type=text
|
||||
name=account placeholder="Account #{n}" value="#{acc}">
|
||||
name=account placeholder="Tili #{n}" value="#{acc}">
|
||||
$maybe err <- accE
|
||||
<span .help-block .error-block>_{err}
|
||||
<div .col-sm-3.col-xs-3 :isJust amtE:.has-error>
|
||||
<input .amount-input.form-control.input-lg type=text
|
||||
name=amount placeholder="Amount #{n}" value="#{amt}">
|
||||
name=amount placeholder="Summa #{n}" value="#{amt}">
|
||||
$maybe err <- amtE
|
||||
<span .help-block .error-block>_{err}
|
||||
|
||||
<div .row>
|
||||
<div .col-sm-9.col-xs-9>
|
||||
$if length files > 1
|
||||
Add to:
|
||||
Kirjaa tiedostoon:
|
||||
|
||||
<div style="display:inline-block; width:auto;" .form-group :isJust (fvErrors fileView):.has-error>
|
||||
^{fvInput fileView}
|
||||
$maybe err <- fvErrors fileView
|
||||
<span .help-block .error-block>#{err}
|
||||
<div .col-sm-3.col-xs-3 style="text-align:right;">
|
||||
<button type=submit .btn .btn-default .btn-lg name=submit style="font-weight:bold;">Save
|
||||
<button type=submit .btn .btn-default .btn-lg name=submit style="font-weight:bold;">Tallenna
|
||||
|
||||
@ -1,8 +1,8 @@
|
||||
<tr :here == journalR:.inacct>
|
||||
<td .top .acct>
|
||||
<a href=@{journalR} :here == journalR:.inacct
|
||||
title="Show general journal entries, most recent first">
|
||||
Journal
|
||||
title="Näytä päiväkirjan kirjaukset uusimmasta vanhimpaan">
|
||||
Kirjanpito
|
||||
<td .top>
|
||||
$forall (acct, adisplay, aindent, abal) <- items
|
||||
<tr
|
||||
@ -12,11 +12,11 @@ $forall (acct, adisplay, aindent, abal) <- items
|
||||
<div .ff-wrapper>
|
||||
\#{indent aindent}
|
||||
<a.acct-name href="@?{(registerR, [("q", replaceInacct q $ accountQuery acct)])}"
|
||||
title="Show transactions affecting this account and subaccounts">
|
||||
title="Näytä tähän tiliin ja sen alitileihin vaikuttavat kirjaukset">
|
||||
#{adisplay}
|
||||
$if hasSubAccounts acct
|
||||
<a href="@?{(registerR, [("q", replaceInacct q $ accountOnlyQuery acct)])}" .only.hidden-sm.hidden-xs
|
||||
title="Show transactions affecting this account but not subaccounts">only
|
||||
title="Näytä vain juuri tähän tiliin vaikuttavat kirjaukset">only
|
||||
<td>
|
||||
^{mixedAmountAsHtml abal}
|
||||
<tr .total>
|
||||
|
||||
@ -17,19 +17,19 @@ $if elem CapView caps
|
||||
<div #message .alert.alert-info>#{m}
|
||||
$if elem CapView caps
|
||||
<form#searchform.input-group method=GET>
|
||||
<input .form-control name=q value=#{q} placeholder="Search"
|
||||
title="Enter hledger search patterns to filter the data below">
|
||||
<input .form-control name=q value=#{q} placeholder="Hae"
|
||||
title="Syötä hakuehtoja rajataksesi alla olevaa dataa">
|
||||
<div .input-group-btn>
|
||||
$if not (T.null q)
|
||||
<a href=@{here} .btn .btn-default title="Clear search terms">
|
||||
<a href=@{here} .btn .btn-default title="Tyhjennä hakuehdot">
|
||||
<span .glyphicon .glyphicon-remove-circle>
|
||||
<button .btn .btn-default type=submit title="Apply search terms">
|
||||
<button .btn .btn-default type=submit title="Hae">
|
||||
<span .glyphicon .glyphicon-search>
|
||||
$if elem CapManage caps
|
||||
<a href="@{ManageR}" .btn.btn-default title="Manage journal files">
|
||||
<a href="@{ManageR}" .btn.btn-default title="Hallinnoi kirjanpidon tiedostoja">
|
||||
<span .glyphicon .glyphicon-wrench>
|
||||
<button .btn .btn-default type=button data-toggle="modal" data-target="#helpmodal"
|
||||
title="Show search and general help">
|
||||
title="Näytä käyttöohjeita">
|
||||
<span .glyphicon .glyphicon-question-sign>
|
||||
^{widget}
|
||||
|
||||
@ -38,43 +38,43 @@ $if elem CapView caps
|
||||
<div .modal-content>
|
||||
<div .modal-header>
|
||||
<button type="button" .close data-dismiss="modal" aria-hidden="true">×
|
||||
<h3 .modal-title #helpLabel>Help
|
||||
<h3 .modal-title #helpLabel>Ohjeet
|
||||
<div .modal-body>
|
||||
<div .row>
|
||||
<div .col-xs-6>
|
||||
<p>
|
||||
<b>Keyboard shortcuts
|
||||
<b>Pikanäppäimet
|
||||
<ul>
|
||||
<li> <code>h</code> or maybe <code>?</code> - view this help (escape or click to exit)
|
||||
<li> <code>j</code> - go to the Journal view (home)
|
||||
<li> <code>a</code> - add a transaction (escape to cancel)
|
||||
<li> <code>s</code> - toggle sidebar
|
||||
<li> <code>f</code> - focus search form ("find")
|
||||
<li> <code>e</code> - hide empty accounts in sidebar
|
||||
<li> <code>h</code> tai (selaimesta riippuen) myös <code>?</code> - näytä nämä ohjeet (paina <code>esc</code> tai klikkaa ruksia poistuaksesi)
|
||||
<li> <code>j</code> - siirry päiväkirjanäkymään (etusivulle)
|
||||
<li> <code>a</code> - lisää uusi kirjaus (paina <code>esc</code> peruaksesi)
|
||||
<li> <code>s</code> - vaihda sivupalkki näkyviin/piilotetuksi
|
||||
<li> <code>f</code> - kohdista hakukenttään
|
||||
<li> <code>e</code> - piilota nollasaldoiset tilit sivupalkista
|
||||
<p>
|
||||
<b>General
|
||||
<b>Yleistä
|
||||
<ul>
|
||||
<li> The Journal view shows general journal entries, representing zero-sum movements of money (or other commodity) between hierarchical accounts
|
||||
<li> The sidebar shows the resulting accounts and their final balances
|
||||
<li> Parent account balances include subaccount balances
|
||||
<li> Multiple currencies in balances are displayed one above the other
|
||||
<li> Click account name links to see transactions affecting that account, with running balance
|
||||
<li> Click date links to see journal entries on that date
|
||||
<li> Pääkirja näytää kirjauksia, jotka esittävät rahan (tai muun hyödykkeen) täydellisiä siirtoja tilien välillä. Siirron täydellisyydellä tarkoitetaan sitä, ettei siitä ole jätetty mitään osaa kirjaamatta, jolloin hyödykettä ei katoa eikä synny tyhjästä.
|
||||
<li> Sivupalkki näyttää käytetyt tilit ja niiden loppusaldot
|
||||
<li> Ylätilien saldot sisältävät niiden alatilien saldot
|
||||
<li> Eri valuutat esitetään saldoissa päällekkäin
|
||||
<li> Klikkaamalla tilin nimeä näet siihen vaikuttavat kirjaukset ja saldon joka siirron jälkeen
|
||||
<li> Klikkaamalla päiväystä näet silloin kirjatut tapahtumat
|
||||
<div .col-xs-6>
|
||||
<p>
|
||||
<b>Search
|
||||
<b>Haku
|
||||
<ul>
|
||||
<li> <code>acct:REGEXP</code> - filter on to/from account
|
||||
<li> <code>desc:REGEXP</code> - filter on description
|
||||
<li> <code>date:PERIODEXP</code>, <code>date2:PERIODEXP</code> - filter on date or secondary date
|
||||
<li> <code>code:REGEXP</code> - filter on transaction's code (eg check number)
|
||||
<li> <code>status:*</code>, <code>status:!</code>, <code>status:</code> - filter on transaction's cleared status (cleared, pending, uncleared)
|
||||
<!-- <li> <code>empty:BOOL</code> - filter on whether amount is zero -->
|
||||
<li> <code>amt:N</code>, <code>amt:<N</code>, <code>amt:>N</code> - filter on the unsigned amount magnitude. Or with a sign before N, filter on the signed value. (Single-commodity amounts only.)
|
||||
<li> <code>cur:REGEXP</code> - filter on the currency/commodity symbol (must match all of it). Dollar sign must be written as <code>\$</code>
|
||||
<li> <code>tag:NAME</code>, <code>tag:NAME=REGEX</code> - filter on tag name, or tag name and value
|
||||
<!-- <li> <code>depth:N</code> - filter out accounts below this depth -->
|
||||
<li> <code>real:BOOL</code> - filter on postings' real/virtual-ness
|
||||
<li> Enclose search patterns containing spaces in single or double quotes
|
||||
<li> Prepend <code>not:</code> to negate a search term
|
||||
<li> Description, account, status query terms are OR'ed, others are AND'ed.
|
||||
<li> <code>acct:REGEXP</code> - suodata tilin nimellä
|
||||
<li> <code>desc:REGEXP</code> - suodata selitteellä
|
||||
<li> <code>date:AIKAVÄLI</code>, <code>date2:AIKAVÄLI</code> - suodata päiväyksen tai toissijaisen päiväkysen perusteella.
|
||||
<li> <code>code:REGEXP</code> - suodata kirjauksen numerolla (esim. tilisiirron viitenumero)
|
||||
<li> <code>status:*</code>, <code>status:!</code>, <code>status:</code> - suodata kirjauksen tilan perusteella (valmis, kesken, tarkistamaton)
|
||||
<!-- <li> <code>empty:BOOL</code> - suodata sen perusteella, onko tilin saldo nolla -->
|
||||
<li> <code>amt:N</code>, <code>amt:<N</code>, <code>amt:>N</code> - suodata summan (itseisarvon) suuruuden perusteella. Etumerkin + tai − lisääminen luvun <code>N</code> eteen rajoittaa suodatuksen vain sen merkkisiin summiin. (ei yhdistä eri valuuttojen määriä)
|
||||
<li> <code>cur:REGEXP</code> - suodata valuutan/hyödykkeen tunnuksella. (koko tunnuksen täytyy täsmätä)
|
||||
<li> <code>tag:NIMI</code>, <code>tag:NIMI=REGEX</code> - suodata tunnisteen nimellä tai nimellä ja arvolla
|
||||
<!-- <li> <code>depth:N</code> - rajoita niihin tileihin, joilla on alle <code>N</code> ylätiliä -->
|
||||
<li> <code>real:BOOL</code> - suodata siirtojen todellisuuden/näennäisyyden perusteella. Näennäissiirtojen summa ei välttämättä ole nolla, eli ne voivat hävittää kirjanpidosta rahaa tai tuoda sitä sinne tyhjästä.
|
||||
<li> Hakuehdot erotellaan välilyönneillä. Välilyönnin voi sisällyttää hakuehtoon ympäröimällä ehdon yksin- tai kaksinkertaisilla suorilla lainausmerkeillä (<code>"</code> tai <code>'</code>)
|
||||
<li> Lisää ehdon alkuun <code>not:</code> valitaksesi ne tapahtumat, jotka eivät toteuta ehtoa
|
||||
<li> Selitteen, tilin nimen ja kirjauksen tilan hakuehdoista riittää toteuttaa yksi, muista ehdoista tapahtuman pitää toteuttaa kaikki tullakseen valituksi.
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
#{extra}
|
||||
<h2>
|
||||
Edit file #
|
||||
Muokkaa tiedostoa #
|
||||
<i>#{f}
|
||||
<div.alert.alert-danger>
|
||||
Are you sure? This will overwrite your journal!
|
||||
Oletko varma? Tämä korvaa vanhan tiedoston täysin!
|
||||
<table.table.table-condensed>
|
||||
<tr>
|
||||
<td colspan=2 style="border:0">
|
||||
@ -11,7 +11,7 @@
|
||||
<tr>
|
||||
<td style="border:0">
|
||||
<span.help>
|
||||
^{helplink "file-format" "File format help"}
|
||||
^{helplink "file-format" "Apua tiedostomudon kanssa (englanniksi)"}
|
||||
<td .text-right style="border:0">
|
||||
<a.btn.btn-default href="@{ManageR}">Go back
|
||||
<input.btn.btn-default type=submit value="Save">
|
||||
<a.btn.btn-default href="@{ManageR}">Peruuta
|
||||
<input.btn.btn-default type=submit value="Tallenna">
|
||||
|
||||
@ -3,16 +3,16 @@
|
||||
|
||||
$if elem CapAdd caps
|
||||
<a #addformlink href="#" role="button" style="cursor:pointer; margin-top:1em;"
|
||||
data-toggle="modal" data-target="#addmodal" title="Add a new transaction to the journal">
|
||||
Add a transaction
|
||||
data-toggle="modal" data-target="#addmodal" title="Lisää uusi tapahtuma kirjanpitoon.">
|
||||
Kirjaa tapahtuma
|
||||
|
||||
<div .table-responsive>
|
||||
<table .transactionsreport .table .table-condensed>
|
||||
<thead>
|
||||
<th .date style="text-align:left;">Date
|
||||
<th .description style="text-align:left;">Description
|
||||
<th .account style="text-align:left;">Account
|
||||
<th .amount style="text-align:right;">Amount
|
||||
<th .date style="text-align:left;">Päiväys
|
||||
<th .description style="text-align:left;">Selite
|
||||
<th .account style="text-align:left;">Tili
|
||||
<th .amount style="text-align:right;">Summa
|
||||
|
||||
$forall torig <- items
|
||||
<tr .title ##{transactionFrag torig} title="#{showTransaction torig}">
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
<h2>
|
||||
Your journal's files
|
||||
Kirjanpitosi tiedostot
|
||||
|
||||
<div.row>
|
||||
<div .col-md-6.col-sm-8.col-xs-12>
|
||||
<table .table.table-condensed>
|
||||
<thead>
|
||||
<th>
|
||||
File
|
||||
Tiedosto
|
||||
<th>
|
||||
<tbody>
|
||||
$forall (path, _) <- jfiles j
|
||||
@ -15,8 +15,8 @@
|
||||
#{path}
|
||||
<td style="text-align:right">
|
||||
<a.btn.btn-default href=@{EditR path}>
|
||||
Edit
|
||||
Muokkaa
|
||||
<a.btn.btn-default href=@{UploadR path}>
|
||||
Upload
|
||||
Korvaa uudella
|
||||
<a.btn.btn-default href=@{DownloadR path}>
|
||||
Download
|
||||
Imuroi
|
||||
|
||||
@ -9,11 +9,11 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align:left;">
|
||||
Date
|
||||
Päiväys
|
||||
<span .glyphicon.glyphicon-chevron-up>
|
||||
<th style="text-align:left;">Description
|
||||
<th style="text-align:left;">To/From Account(s)
|
||||
<th style="text-align:right; white-space:normal;">Amount Out/In
|
||||
<th style="text-align:left;">Kuvaus
|
||||
<th style="text-align:left;">Tileille/Tileiltä
|
||||
<th style="text-align:right; white-space:normal;">Siirretty summa
|
||||
<th style="text-align:right; white-space:normal;">
|
||||
#{balancelabel}
|
||||
|
||||
|
||||
@ -1,14 +1,14 @@
|
||||
<h2>
|
||||
Upload to file #
|
||||
Korvaa tiedosto #
|
||||
<i>#{f}
|
||||
<div.alert.alert-danger>
|
||||
Are you sure? This will overwrite your journal!
|
||||
Oletko varma? Tämä korvaa vanhan tiedoston täysin!
|
||||
<div.form-group>
|
||||
<label .btn.btn-primary for="file">
|
||||
<input type=file id=file name=file style="display:none"
|
||||
onchange="\$('#file-info').html(this.files[0].name)" />
|
||||
Select file
|
||||
Valitse korvattava tiedosto
|
||||
<span .label.label-info id="file-info">
|
||||
<div.form-group>
|
||||
<input .btn.btn-default type=submit value="Upload">
|
||||
<input .btn.btn-default type=submit value="Korvaa">
|
||||
#{extra}
|
||||
|
||||
8
hledger-web/test/webtest.org
Normal file
8
hledger-web/test/webtest.org
Normal file
@ -0,0 +1,8 @@
|
||||
* hledger-web extra tests
|
||||
|
||||
Additional, manual tests for hledger-web.
|
||||
These should be moved to the automated test suite when possible
|
||||
(Hledger/Web/Test.hs, `stack test hledger-web`).
|
||||
|
||||
** hledger-web -f/dev/null, a, submit a transaction: should succeed
|
||||
Adding to a single file, with no file field showing in the add form, should work. (#1932)
|
||||
@ -1,2 +1,2 @@
|
||||
m4_dnl Date to show in man pages. Updated by "Shake manuals"
|
||||
m4_define({{_monthyear_}}, {{August 2022}})m4_dnl
|
||||
m4_define({{_monthyear_}}, {{September 2022}})m4_dnl
|
||||
|
||||
@ -1 +1 @@
|
||||
1.26.99
|
||||
1.27.1
|
||||
|
||||
@ -1,2 +1,2 @@
|
||||
m4_dnl Version number to show in manuals. Updated by "Shake setversion"
|
||||
m4_define({{_version_}}, {{1.26.99}})m4_dnl
|
||||
m4_define({{_version_}}, {{1.27.1}})m4_dnl
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
User-visible changes in the hledger command line tool and library.
|
||||
|
||||
|
||||
# b46cb8a7f
|
||||
# 1.27 2022-09-01
|
||||
|
||||
Features
|
||||
|
||||
@ -71,11 +71,7 @@ Fixes
|
||||
|
||||
- bal: budget goals were ignoring rule-specified start date
|
||||
|
||||
- bal: Allow cumulative gain and valuechange reports (Stephen Morgan)
|
||||
Previously, --cumulative with --gain or --valuechange would produce an
|
||||
empty report. This fixes this issue to produce a reasonable report.
|
||||
|
||||
- cs/bs/is: Fixed non-display of child accounts when there is an
|
||||
- cf/bs/is: Fixed non-display of child accounts when there is an
|
||||
intervening account of another type.
|
||||
(#1921) (Stephen Morgan)
|
||||
|
||||
|
||||
@ -573,14 +573,20 @@ multiBalanceReportHtmlRows ropts mbr =
|
||||
-- | Render one MultiBalanceReport heading row as a HTML table row.
|
||||
multiBalanceReportHtmlHeadRow :: ReportOpts -> [T.Text] -> Html ()
|
||||
multiBalanceReportHtmlHeadRow _ [] = mempty -- shouldn't happen
|
||||
multiBalanceReportHtmlHeadRow ropts (acct:rest) =
|
||||
multiBalanceReportHtmlHeadRow ropts (acct:cells) =
|
||||
let
|
||||
defstyle = style_ ""
|
||||
(amts,tot,avg)
|
||||
| row_total_ ropts && average_ ropts = (init $ init rest, [last $ init rest], [last rest])
|
||||
| row_total_ ropts = (init rest, [last rest], [])
|
||||
| average_ ropts = (init rest, [], [last rest])
|
||||
| otherwise = (rest, [], [])
|
||||
| row_total_ ropts && average_ ropts = (ini2, sndlst2, lst2)
|
||||
| row_total_ ropts = (ini1, lst1, [])
|
||||
| average_ ropts = (ini1, [], lst1)
|
||||
| otherwise = (cells, [], [])
|
||||
where
|
||||
n = length cells
|
||||
(ini1,lst1) = splitAt (n-1) cells
|
||||
(ini2, rest) = splitAt (n-2) cells
|
||||
(sndlst2,lst2) = splitAt 1 rest
|
||||
|
||||
in
|
||||
tr_ $ mconcat $
|
||||
td_ [class_ "account"] (toHtml acct)
|
||||
@ -591,14 +597,19 @@ multiBalanceReportHtmlHeadRow ropts (acct:rest) =
|
||||
-- | Render one MultiBalanceReport data row as a HTML table row.
|
||||
multiBalanceReportHtmlBodyRow :: ReportOpts -> [T.Text] -> Html ()
|
||||
multiBalanceReportHtmlBodyRow _ [] = mempty -- shouldn't happen
|
||||
multiBalanceReportHtmlBodyRow ropts (label:rest) =
|
||||
multiBalanceReportHtmlBodyRow ropts (label:cells) =
|
||||
let
|
||||
defstyle = style_ "text-align:right"
|
||||
(amts,tot,avg)
|
||||
| row_total_ ropts && average_ ropts = (init $ init rest, [last $ init rest], [last rest])
|
||||
| row_total_ ropts = (init rest, [last rest], [])
|
||||
| average_ ropts = (init rest, [], [last rest])
|
||||
| otherwise = (rest, [], [])
|
||||
| row_total_ ropts && average_ ropts = (ini2, sndlst2, lst2)
|
||||
| row_total_ ropts = (ini1, lst1, [])
|
||||
| average_ ropts = (ini1, [], lst1)
|
||||
| otherwise = (cells, [], [])
|
||||
where
|
||||
n = length cells
|
||||
(ini1,lst1) = splitAt (n-1) cells
|
||||
(ini2, rest) = splitAt (n-2) cells
|
||||
(sndlst2,lst2) = splitAt 1 rest
|
||||
in
|
||||
tr_ $ mconcat $
|
||||
td_ [class_ "account", style_ "text-align:left"] (toHtml label)
|
||||
@ -615,14 +626,19 @@ multiBalanceReportHtmlFootRow _ropts [] = mempty
|
||||
-- : repeat nullmixedamt zeros
|
||||
-- ++ (if row_total_ ropts then [nullmixedamt] else [])
|
||||
-- ++ (if average_ ropts then [nullmixedamt] else [])
|
||||
multiBalanceReportHtmlFootRow ropts (acct:rest) =
|
||||
multiBalanceReportHtmlFootRow ropts (acct:cells) =
|
||||
let
|
||||
defstyle = style_ "text-align:right"
|
||||
(amts,tot,avg)
|
||||
| row_total_ ropts && average_ ropts = (init $ init rest, [last $ init rest], [last rest])
|
||||
| row_total_ ropts = (init rest, [last rest], [])
|
||||
| average_ ropts = (init rest, [], [last rest])
|
||||
| otherwise = (rest, [], [])
|
||||
| row_total_ ropts && average_ ropts = (ini2, sndlst2, lst2)
|
||||
| row_total_ ropts = (ini1, lst1, [])
|
||||
| average_ ropts = (ini1, [], lst1)
|
||||
| otherwise = (cells, [], [])
|
||||
where
|
||||
n = length cells
|
||||
(ini1,lst1) = splitAt (n-1) cells
|
||||
(ini2, rest) = splitAt (n-2) cells
|
||||
(sndlst2,lst2) = splitAt 1 rest
|
||||
in
|
||||
tr_ $ mconcat $
|
||||
th_ [style_ "text-align:left"] (toHtml acct)
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
.\"t
|
||||
|
||||
.TH "HLEDGER" "1" "August 2022" "hledger-1.26.99 " "hledger User Manuals"
|
||||
.TH "HLEDGER" "1" "September 2022" "hledger-1.27 " "hledger User Manuals"
|
||||
|
||||
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
This is the command-line interface (CLI) for the hledger accounting
|
||||
tool.
|
||||
Here we also describe hledger\[aq]s concepts and file formats.
|
||||
This manual is for hledger 1.26.99.
|
||||
This manual is for hledger 1.27.
|
||||
.SH SYNOPSIS
|
||||
.PP
|
||||
\f[C]hledger\f[R]
|
||||
@ -1564,38 +1564,257 @@ not the old one, and \f[C]amt:\f[R] matches the new quantity, and not
|
||||
the old one.
|
||||
Note: this changed in hledger 1.22, previously it was the reverse, see
|
||||
the discussion at #1625.
|
||||
.SH CONVERSION & COST
|
||||
.SH COST
|
||||
.PP
|
||||
This section is about converting between commodities.
|
||||
Some definitions:
|
||||
This section is about recording the cost of things, in transactions
|
||||
where one commodity is exchanged for another.
|
||||
Eg an exchange of currency, or a stock purchase or sale.
|
||||
First, a quick glossary:
|
||||
.IP \[bu] 2
|
||||
A \[dq]commodity conversion\[dq] is an exchange of one currency or
|
||||
commodity for another.
|
||||
Conversion - an exchange of one currency or commodity for another.
|
||||
Eg a foreign currency exchange, or a purchase or sale of stock or
|
||||
cryptocurrency.
|
||||
.IP \[bu] 2
|
||||
A \[dq]conversion transaction\[dq] is a transaction involving one or
|
||||
more such conversions.
|
||||
Conversion transaction - a transaction involving one or more
|
||||
conversions.
|
||||
.IP \[bu] 2
|
||||
\[dq]Conversion rate\[dq] is the exchange rate in a conversion - the
|
||||
cost per unit of one commodity in the other.
|
||||
Conversion rate - the cost per unit of one commodity in the other, ie
|
||||
the exchange rate.
|
||||
.IP \[bu] 2
|
||||
\[dq]Cost\[dq] is how much of one commodity was paid to acquire the
|
||||
other (when buying), or how much was received in exchange for the other
|
||||
(when selling).
|
||||
We call both of these \[dq]cost\[dq] for convenience (after all, it is
|
||||
cost for one party or the other).
|
||||
.SS Recording conversions
|
||||
Cost - how much of one commodity was paid to acquire the other.
|
||||
And more generally, in hledger docs: the amount exchanged in the
|
||||
\[dq]secondary\[dq] commodity (usually your base currency), whether in a
|
||||
purchase or a sale, and whether expressed per unit or in total.
|
||||
Or, the \[at]/\[at]\[at] notation used to represent this.
|
||||
.IP \[bu] 2
|
||||
Transaction price - another name for the cost expressed with
|
||||
hledger\[aq]s cost notation.
|
||||
.SS -B: Convert to cost
|
||||
.PP
|
||||
As a concrete example, let\[aq]s assume 100 EUR was converted to 120
|
||||
USD.
|
||||
There are several ways to record this in the journal, each with pros and
|
||||
cons which will be explained in more detail below.
|
||||
(Also, these examples use journal format which is properly explained
|
||||
much further below; sorry about that, you may want to read some of that
|
||||
first.)
|
||||
.SS Implicit conversion
|
||||
As discussed a little further on in Transaction prices, when recording a
|
||||
transaction you can also record the amount\[aq]s cost in another
|
||||
commodity, by adding \f[C]\[at] UNITPRICE\f[R] or
|
||||
\f[C]\[at]\[at] TOTALPRICE\f[R].
|
||||
.PP
|
||||
Then you can see a report with amounts converted to cost, by adding the
|
||||
\f[C]-B/--cost\f[R] flag.
|
||||
(Mnemonic: \[dq]B\[dq] from \[dq]cost Basis\[dq], as in Ledger).
|
||||
Eg:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
2022-01-01
|
||||
assets:dollars $-135 ; 135 dollars is exchanged for..
|
||||
assets:euros \[Eu]100 \[at] $1.35 ; one hundred euros purchased at $1.35 each
|
||||
\f[R]
|
||||
.fi
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
$ hledger bal -N
|
||||
$-135 assets:dollars
|
||||
\[Eu]100 assets:euros
|
||||
$ hledger bal -N -B
|
||||
$-135 assets:dollars
|
||||
$135 assets:euros # <- the euros\[aq] cost
|
||||
\f[R]
|
||||
.fi
|
||||
.PP
|
||||
Notes:
|
||||
.PP
|
||||
-B is sensitive to the order of postings when a transaction price is
|
||||
inferred: the inferred price will be in the commodity of the last
|
||||
amount.
|
||||
So if example 3\[aq]s postings are reversed, while the transaction is
|
||||
equivalent, -B shows something different:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
2022-01-01
|
||||
assets:dollars $-135 ; 135 dollars sold
|
||||
assets:euros \[Eu]100 ; for 100 euros
|
||||
\f[R]
|
||||
.fi
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
$ hledger bal -N -B
|
||||
\[Eu]-100 assets:dollars # <- the dollars\[aq] selling price
|
||||
\[Eu]100 assets:euros
|
||||
\f[R]
|
||||
.fi
|
||||
.PP
|
||||
The \[at]/\[at]\[at] cost notation is convenient, but has some
|
||||
drawbacks: it does not truly balance the transaction, so it disrupts the
|
||||
accounting equation and tends to causes a non-zero total in balance
|
||||
reports.
|
||||
.SS Equity conversion postings
|
||||
.PP
|
||||
By contrast, conventional double entry bookkeeping (DEB) uses a
|
||||
different notation: an extra pair of equity postings to balance
|
||||
conversion transactions.
|
||||
In this style, the above entry might be written:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
2022-01-01 one hundred euros purchased at $1.35 each
|
||||
assets:dollars $-135
|
||||
equity:conversion $135
|
||||
equity:conversion \[Eu]-100
|
||||
assets:euros \[Eu]100
|
||||
\f[R]
|
||||
.fi
|
||||
.PP
|
||||
This style is more correct, but it\[aq]s also more verbose and makes
|
||||
cost reporting more difficult for PTA tools.
|
||||
.PP
|
||||
Happily, current hledger can read either notation, or convert one to the
|
||||
other when needed, so you can use the one you prefer.
|
||||
.SS Inferring equity postings from cost
|
||||
.PP
|
||||
With \f[C]--infer-equity\f[R], hledger detects transactions written with
|
||||
PTA cost notation and adds equity conversion postings to them (and
|
||||
temporarily permits the coexistence of equity conversion postings and
|
||||
cost notation, which normally would cause an unbalanced transaction
|
||||
error).
|
||||
Eg:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
2022-01-01
|
||||
assets:dollars -$135
|
||||
assets:euros \[Eu]100 \[at] $1.35
|
||||
\f[R]
|
||||
.fi
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
$ hledger print --infer-equity
|
||||
2022-01-01
|
||||
assets:dollars $-135
|
||||
assets:euros \[Eu]100 \[at] $1.35
|
||||
equity:conversion:$-\[Eu]:\[Eu] \[Eu]-100 ; generated-posting:
|
||||
equity:conversion:$-\[Eu]:$ $135.00 ; generated-posting:
|
||||
\f[R]
|
||||
.fi
|
||||
.PP
|
||||
The conversion account names can be changed with the conversion account
|
||||
type declaration.
|
||||
.PP
|
||||
--infer-equity is useful when when transactions have been recorded using
|
||||
PTA cost notation, to help preserve the accounting equation and balance
|
||||
reports\[aq] zero total, or to produce more conventional journal entries
|
||||
for sharing with non-PTA-users.
|
||||
.PP
|
||||
\f[I]Experimental\f[R]
|
||||
.SS Inferring cost from equity postings
|
||||
.PP
|
||||
The reverse operation is possible using \f[C]--infer-costs\f[R], which
|
||||
detects transactions written with equity conversion postings and adds
|
||||
PTA cost notation to them (and temporarily permits the coexistence of
|
||||
equity conversion postings and cost notation).
|
||||
Eg:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
2022-01-01
|
||||
assets:dollars $-135
|
||||
equity:conversion $135
|
||||
equity:conversion \[Eu]-100
|
||||
assets:euros \[Eu]100
|
||||
\f[R]
|
||||
.fi
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
$ hledger print --infer-costs
|
||||
2022-01-01
|
||||
assets:dollars $-135 \[at]\[at] \[Eu]100
|
||||
equity:conversion $135
|
||||
equity:conversion \[Eu]-100
|
||||
assets:euros \[Eu]100
|
||||
\f[R]
|
||||
.fi
|
||||
.PP
|
||||
--infer-costs is useful when combined with -B/--cost, allowing cost
|
||||
reporting even when transactions have been recorded using equity
|
||||
postings:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
$ hledger print --infer-costs -B
|
||||
2009-01-01
|
||||
assets:dollars \[Eu]-100
|
||||
assets:euros \[Eu]100
|
||||
\f[R]
|
||||
.fi
|
||||
.PP
|
||||
Notes:
|
||||
.PP
|
||||
Postings will be recognised as equity conversion postings if they are 1.
|
||||
to account(s) declared with type \f[C]V\f[R] (\f[C]Conversion\f[R]; or
|
||||
if no such accounts are declared, accounts named
|
||||
\f[C]equity:conversion\f[R], \f[C]equity:trade\f[R],
|
||||
\f[C]equity:trading\f[R], or subaccounts of these) 2.
|
||||
adjacent 3.
|
||||
and exactly matching the amounts of two non-conversion postings.
|
||||
.PP
|
||||
The total cost is appended to the first matching posting in the
|
||||
transaction.
|
||||
If you need to assign it to a different posting, or if you have several
|
||||
different sets of conversion postings in one transaction, you may need
|
||||
to write the costs explicitly yourself.
|
||||
Eg:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
2022-01-01
|
||||
assets:dollars $-135
|
||||
equity:conversion \[Eu]-100
|
||||
equity:conversion $135
|
||||
assets:euros \[Eu]100 \[at]\[at] $135
|
||||
\f[R]
|
||||
.fi
|
||||
.PP
|
||||
or:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
2022-01-01
|
||||
assets:dollars $-235
|
||||
assets:euros \[Eu]100 \[at] $1.35 ; 100 euros bought for $1.35 each
|
||||
equity:conversion \[Eu]-100
|
||||
equity:conversion $135
|
||||
assets:pounds \[Po]80 \[at]\[at] $100 ; 80 pounds bought for $100 total
|
||||
equity:conversion \[Po]-80
|
||||
equity:conversion $100
|
||||
\f[R]
|
||||
.fi
|
||||
.PP
|
||||
--infer-equity and --infer-costs can be used together, eg if you have a
|
||||
mixture of both notations.
|
||||
.PP
|
||||
\f[I]Experimental\f[R]
|
||||
.SS When to infer cost/equity
|
||||
.PP
|
||||
Inferring equity postings or costs is still fairly new, so not enabled
|
||||
by default.
|
||||
We\[aq]re not sure yet if that should change.
|
||||
Here are two suggestions to try, experience reports welcome:
|
||||
.IP "1." 3
|
||||
When you use -B, always use --infer-costs as well.
|
||||
Eg: \f[C]hledger bal -B --infer-costs\f[R]
|
||||
.IP "2." 3
|
||||
Always run hledger with both flags enabled.
|
||||
Eg: \f[C]alias hl=\[dq]hledger --infer-equity --infer-costs\[dq]\f[R]
|
||||
.SS How to record conversions
|
||||
.PP
|
||||
Essentially there are four ways to record a conversion transaction in
|
||||
hledger.
|
||||
Here are all of them, with pros and cons.
|
||||
.SS Conversion with implicit cost
|
||||
.PP
|
||||
Let\[aq]s assume 100 EUR is converted to 120 USD.
|
||||
You can just record the outflow (100 EUR) and inflow (120 USD) in the
|
||||
appropriate asset account:
|
||||
.IP
|
||||
@ -1613,25 +1832,24 @@ You can see the inferred rate by using \f[C]hledger print -x\f[R].
|
||||
.PP
|
||||
Pro:
|
||||
.IP \[bu] 2
|
||||
Easy, concise
|
||||
.IP \[bu] 2
|
||||
hledger can do cost reporting
|
||||
Concise, easy
|
||||
.PP
|
||||
Con:
|
||||
.IP \[bu] 2
|
||||
Less error checking - typos in amounts or commodity symbols may not be
|
||||
detected
|
||||
.IP \[bu] 2
|
||||
conversion rate is not clear
|
||||
Conversion rate is not clear
|
||||
.IP \[bu] 2
|
||||
disturbs the accounting equation
|
||||
Disturbs the accounting equation, unless you add the --infer-equity flag
|
||||
.PP
|
||||
You can prevent accidental implicit conversions due to a mistyped
|
||||
commodity symbol, by using \f[C]hledger check commodities\f[R].
|
||||
.PP
|
||||
You can prevent implicit conversions entirely, by using
|
||||
\f[C]hledger check balancednoautoconversion\f[R], or
|
||||
\f[C]-s/--strict\f[R].
|
||||
.SS Priced conversion
|
||||
.SS Conversion with explicit cost
|
||||
.PP
|
||||
You can add the conversion rate using \[at] notation:
|
||||
.IP
|
||||
@ -1650,16 +1868,14 @@ Pro:
|
||||
.IP \[bu] 2
|
||||
Still concise
|
||||
.IP \[bu] 2
|
||||
makes the conversion rate clear
|
||||
Makes the conversion rate clear
|
||||
.IP \[bu] 2
|
||||
provides some error checking
|
||||
.IP \[bu] 2
|
||||
hledger can do cost reporting
|
||||
Provides more error checking
|
||||
.PP
|
||||
Con:
|
||||
.IP \[bu] 2
|
||||
Disturbs the accounting equation without the --infer-equity flag
|
||||
.SS Equity conversion
|
||||
Disturbs the accounting equation, unless you add the --infer-equity flag
|
||||
.SS Conversion with equity postings
|
||||
.PP
|
||||
In strict double entry bookkeeping, the above transaction is not
|
||||
balanced in EUR or in USD, since some EUR disappears, and some USD
|
||||
@ -1684,24 +1900,22 @@ Pro:
|
||||
.IP \[bu] 2
|
||||
Preserves the accounting equation
|
||||
.IP \[bu] 2
|
||||
keeps track of conversions and related gains/losses in one place
|
||||
Keeps track of conversions and related gains/losses in one place
|
||||
.IP \[bu] 2
|
||||
works in any double entry accounting system
|
||||
.IP \[bu] 2
|
||||
hledger can convert this to transaction prices using the --infer-costs
|
||||
flag
|
||||
Standard, works in any double entry accounting system
|
||||
.PP
|
||||
Con:
|
||||
.IP \[bu] 2
|
||||
More verbose
|
||||
.IP \[bu] 2
|
||||
conversion rate is not clear
|
||||
Conversion rate is not obvious
|
||||
.IP \[bu] 2
|
||||
depends on the order of postings
|
||||
.SS Priced equity conversion
|
||||
Cost reporting requires adding the --infer-costs flag
|
||||
.SS Conversion with equity postings and explicit cost
|
||||
.PP
|
||||
Another notation is to record both the conversion rate and the equity
|
||||
postings:
|
||||
Here both equity postings and \[at] notation are used together.
|
||||
hledger will usually complain about this redundancy, but when using the
|
||||
--infer-costs flag it is accepted.
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
@ -1717,68 +1931,39 @@ Pro:
|
||||
.IP \[bu] 2
|
||||
Preserves the accounting equation
|
||||
.IP \[bu] 2
|
||||
keeps track of conversions and related gains/losses in one place
|
||||
Keeps track of conversions and related gains/losses in one place
|
||||
.IP \[bu] 2
|
||||
makes the conversion rate clear
|
||||
Makes the conversion rate clear
|
||||
.IP \[bu] 2
|
||||
provides some error checking
|
||||
.IP \[bu] 2
|
||||
hledger can do cost reporting
|
||||
Provides more error checking
|
||||
.PP
|
||||
Con:
|
||||
.IP \[bu] 2
|
||||
Most verbose
|
||||
.IP \[bu] 2
|
||||
Requires --infer-costs flag
|
||||
Requires the --infer-costs flag
|
||||
.IP \[bu] 2
|
||||
Not compatible with ledger
|
||||
.SS Inferring missing conversion rates
|
||||
.PP
|
||||
hledger will do this automatically for implicit conversions.
|
||||
Currently it can not do this for equity conversions.
|
||||
.SS Inferring missing equity postings
|
||||
.PP
|
||||
With the \f[C]--infer-equity\f[R] flag, hledger will add equity postings
|
||||
to priced and implicit conversions.
|
||||
.SS Inferring missing transaction prices from equity postings
|
||||
.PP
|
||||
With the \f[C]--infer-costs\f[R] flag, hledger will add transaction
|
||||
prices from equity postings, and will be able to handle transaction
|
||||
prices and equity postings together.
|
||||
.SS Cost reporting
|
||||
.PP
|
||||
With the \f[C]-B/--cost\f[R] flag, hledger will convert the amounts in
|
||||
priced and implicit conversions to their cost in the other commodity.
|
||||
This is useful to see a report of what you paid for things (or how much
|
||||
you sold things for).
|
||||
Currently \f[C]-B/--cost\f[R] does not work on equity conversions, and
|
||||
it disables \f[C]--infer-equity\f[R].
|
||||
.PP
|
||||
These operations are transient, only affecting reports.
|
||||
If you want to change the journal file permanently, you could pipe each
|
||||
entry through
|
||||
\f[C]hledger -f- -I print [-x] [--infer-equity] [--infer-costs] [-B]\f[R]
|
||||
.SS Conversion summary
|
||||
.SS Cost tips
|
||||
.IP \[bu] 2
|
||||
Recording the conversion rate is good because it makes that clear and
|
||||
allows cost reporting.
|
||||
Recording the conversion rate explicitly is good because it makes that
|
||||
clear and helps detect errors.
|
||||
.IP \[bu] 2
|
||||
Recording equity postings is good because it balances the accounting
|
||||
equation and is correct bookkeeping.
|
||||
Recording equity postings is good because it is correct bookkeeping and
|
||||
preserves the accounting equation.
|
||||
.IP \[bu] 2
|
||||
Combining these is possible with the --infer-costs flag, but has certain
|
||||
requirements for the order of postings.
|
||||
Combining these is possible by using the --infer-costs flag (which
|
||||
requires well-ordered postings).
|
||||
.IP \[bu] 2
|
||||
When you want to see the cost (or sale proceeds) of things, use
|
||||
\f[C]-B/--cost\f[R].
|
||||
\f[C]-B\f[R] (or \f[C]--cost\f[R]).
|
||||
If you use equity conversion postings notation, use
|
||||
\f[C]-B --infer-costs\f[R].
|
||||
.IP \[bu] 2
|
||||
When you want to see a balanced balance sheet or correct journal
|
||||
entries, use \f[C]--infer-equity\f[R].
|
||||
If you use PTA cost notation, and you want to see a balanced balance
|
||||
sheet or print correct journal entries, use \f[C]--infer-equity\f[R].
|
||||
.IP \[bu] 2
|
||||
\f[C]--cost\f[R] will remove any balancing equity posts, so as not to
|
||||
disturb the accounting equation.
|
||||
.IP \[bu] 2
|
||||
Conversion/cost operations are performed before valuation.
|
||||
Conversion to cost is performed before valuation (described next).
|
||||
.SH VALUATION
|
||||
.PP
|
||||
Instead of reporting amounts in their original commodity, hledger can
|
||||
@ -6988,18 +7173,30 @@ number, eg 0.5 displayed with zero decimal places is \[dq]0\[dq]).
|
||||
hledger was built with Decimal < 0.5.1.)
|
||||
.SS Transaction prices
|
||||
.PP
|
||||
Within a transaction, you can note an amount\[aq]s price in another
|
||||
commodity.
|
||||
This can be used to document the cost (in a purchase) or selling price
|
||||
(in a sale).
|
||||
For example, transaction prices are useful to record purchases of a
|
||||
foreign currency.
|
||||
Note transaction prices are fixed at the time of the transaction, and do
|
||||
not change over time.
|
||||
See also market prices, which represent prevailing exchange rates on a
|
||||
certain date.
|
||||
(AKA Costs)
|
||||
.PP
|
||||
There are several ways to record a transaction price:
|
||||
After a posting amount, you can note its cost or selling price in
|
||||
another commodity, by writing either \f[C]\[at] UNITPRICE\f[R] or
|
||||
\f[C]\[at]\[at] TOTALPRICE\f[R] after it.
|
||||
This indicates a conversion transaction, where one commodity is
|
||||
exchanged for another.
|
||||
.PP
|
||||
hledger docs have historically called this a \[dq]transaction price\[dq]
|
||||
because it is specific to one transaction, unlike market prices which
|
||||
are not.
|
||||
\[dq]Cost\[dq] is shorter and might be preferable; just remember this
|
||||
feature can represent either a buyer\[aq]s cost, or a seller\[aq]s
|
||||
price.
|
||||
.PP
|
||||
Costs are usually written explicitly with \f[C]\[at]\f[R] or
|
||||
\f[C]\[at]\[at]\f[R], but can also be inferred automatically for simple
|
||||
multi-commodity transactions.
|
||||
.PD 0
|
||||
.P
|
||||
.PD
|
||||
As an example, here are several ways to record purchases of a foreign
|
||||
currency in hledger, using the cost notation either explicitly or
|
||||
implicitly:
|
||||
.IP "1." 3
|
||||
Write the price per unit, as \f[C]\[at] UNITPRICE\f[R] after the amount:
|
||||
.RS 4
|
||||
@ -7046,131 +7243,8 @@ Like 1, but the \f[C]\[at]\f[R] is parenthesised, i.e.
|
||||
Like 2, but as in 4 the \f[C]\[at]\[at]\f[R] is parenthesised, i.e.
|
||||
\f[C](\[at]\[at])\f[R]; in hledger, this is equivalent to 2.
|
||||
.PP
|
||||
Use the \f[C]-B/--cost\f[R] flag to convert amounts to their transaction
|
||||
price\[aq]s commodity, if any.
|
||||
(mnemonic: \[dq]B\[dq] is from \[dq]cost Basis\[dq], as in Ledger).
|
||||
Eg here is how -B affects the balance report for the example above:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
$ hledger bal -N --flat
|
||||
$-135 assets:dollars
|
||||
\[Eu]100 assets:euros
|
||||
$ hledger bal -N --flat -B
|
||||
$-135 assets:dollars
|
||||
$135 assets:euros # <- the euros\[aq] cost
|
||||
\f[R]
|
||||
.fi
|
||||
.PP
|
||||
Note -B is sensitive to the order of postings when a transaction price
|
||||
is inferred: the inferred price will be in the commodity of the last
|
||||
amount.
|
||||
So if example 3\[aq]s postings are reversed, while the transaction is
|
||||
equivalent, -B shows something different:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
2009/1/1
|
||||
assets:dollars $-135 ; 135 dollars sold
|
||||
assets:euros \[Eu]100 ; for 100 euros
|
||||
\f[R]
|
||||
.fi
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
$ hledger bal -N --flat -B
|
||||
\[Eu]-100 assets:dollars # <- the dollars\[aq] selling price
|
||||
\[Eu]100 assets:euros
|
||||
\f[R]
|
||||
.fi
|
||||
.SS Equity conversion postings
|
||||
.PP
|
||||
Transaction prices can be converted to and from equity conversion
|
||||
postings using the \f[C]--infer-equity\f[R] and \f[C]--infer-costs\f[R]
|
||||
flags.
|
||||
.PP
|
||||
With \f[C]--infer-equity\f[R], hledger will add equity postings to
|
||||
balance out any transaction prices.
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
2009/1/1
|
||||
assets:euros \[Eu]100 \[at] $1.35 ; 100 euros bought
|
||||
assets:dollars -$135 ; for $135
|
||||
\f[R]
|
||||
.fi
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
$ hledger print --infer-equity
|
||||
|
||||
2009-01-01
|
||||
assets:euros \[Eu]100 \[at] $1.35 ; 100 euros bought
|
||||
equity:conversion:$-\[Eu]:\[Eu] \[Eu]-100 ; 100 euros bought, generated-posting:
|
||||
equity:conversion:$-\[Eu]:$ $135.00 ; 100 euros bought, generated-posting:
|
||||
assets:dollars $-135 ; for $135
|
||||
\f[R]
|
||||
.fi
|
||||
.PP
|
||||
The reverse is possible using \f[C]--infer-costs\f[R], which will check
|
||||
any equity conversion postings and generate a transaction price for the
|
||||
\f[I]first\f[R] non-conversion posting which matches.
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
2009-01-01
|
||||
assets:euros \[Eu]100 ; 100 euros bought
|
||||
equity:conversion \[Eu]-100
|
||||
equity:conversion $135
|
||||
assets:dollars $-135 ; for $135
|
||||
\f[R]
|
||||
.fi
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
$ hledger print --infer-costs
|
||||
|
||||
2009-01-01
|
||||
assets:euros \[Eu]100 \[at]\[at] $135 ; 100 euros bought
|
||||
equity:conversion \[Eu]-100
|
||||
equity:conversion $135
|
||||
assets:dollars $-135 ; for $135
|
||||
\f[R]
|
||||
.fi
|
||||
.PP
|
||||
Note that the above will assign the transaction price to the first
|
||||
matching posting in the transaction.
|
||||
If you want to assign it to a different posting, or if you have several
|
||||
different sets of conversion postings which must match different
|
||||
postings, you must manually specify the transaction price.
|
||||
If you do this, equity conversion postings must occur in adjacent pairs
|
||||
and must exactly match the amount of a non-conversion posting.
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
2009-01-01
|
||||
assets:dollars $-135 ; $135 paid
|
||||
equity:conversion \[Eu]-100
|
||||
equity:conversion $135
|
||||
assets:euros \[Eu]100 \[at]\[at] $135 ; to buy 100 euros
|
||||
\f[R]
|
||||
.fi
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
2009-01-01
|
||||
assets:euros \[Eu]100 \[at] $1.35 ; 100 euros bought
|
||||
equity:conversion \[Eu]-100
|
||||
equity:conversion $135
|
||||
assets:pounds \[Po]80 \[at]\[at] $100 ; 80 pounds bought
|
||||
equity:conversion \[Po]-80
|
||||
equity:conversion $100
|
||||
assets:dollars $-235 ; for $235 total
|
||||
\f[R]
|
||||
.fi
|
||||
.PP
|
||||
The account names used for the conversion accounts can be changed with
|
||||
the conversion account type declaration.
|
||||
Amounts can be converted to cost at report time using the
|
||||
\f[C]-B/--cost\f[R] flag; this is discussed more in the COST section.
|
||||
.SS Lot prices, lot dates
|
||||
.PP
|
||||
Ledger allows another kind of price, lot price (four variants:
|
||||
@ -8113,7 +8187,7 @@ or, it can be (these are used less often):
|
||||
assets for the cashflow report)
|
||||
.IP \[bu] 2
|
||||
\f[C]V\f[R] or \f[C]Conversion\f[R] (a subtype of Equity, for
|
||||
conversions (see CONVERSION & COST).)
|
||||
conversions (see COST).)
|
||||
.PP
|
||||
Here is a typical set of account type declarations:
|
||||
.IP
|
||||
@ -10933,7 +11007,7 @@ Show only asset and liability balances, as a flat list, limited to depth
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
$ hledger bal assets liabilities --flat -2
|
||||
$ hledger bal assets liabilities -2
|
||||
$4000 assets:bank
|
||||
$105 assets:cash
|
||||
$-50 liabilities:creditcard
|
||||
@ -10947,7 +11021,7 @@ balance sheet:
|
||||
.IP
|
||||
.nf
|
||||
\f[C]
|
||||
$ hledger bs --flat -2
|
||||
$ hledger bs -2
|
||||
Balance Sheet 2020-01-16
|
||||
|
||||
|| 2020-01-16
|
||||
|
||||
@ -5,7 +5,7 @@ cabal-version: 1.12
|
||||
-- see: https://github.com/sol/hpack
|
||||
|
||||
name: hledger
|
||||
version: 1.26.99
|
||||
version: 1.27.1
|
||||
synopsis: Command-line interface for the hledger accounting system
|
||||
description: The command-line interface for the hledger accounting system.
|
||||
Its basic function is to read a plain text file describing
|
||||
@ -134,7 +134,7 @@ library
|
||||
other-modules:
|
||||
Paths_hledger
|
||||
ghc-options: -Wall -Wno-incomplete-uni-patterns -Wno-missing-signatures -Wno-orphans -Wno-type-defaults -Wno-unused-do-bind -optP-Wno-nonportable-include-path
|
||||
cpp-options: -DVERSION="1.26.99"
|
||||
cpp-options: -DVERSION="1.27.1"
|
||||
build-depends:
|
||||
Decimal >=0.5.1
|
||||
, Diff >=0.2
|
||||
@ -152,7 +152,7 @@ library
|
||||
, githash >=0.1.6.1
|
||||
, hashable >=1.2.4
|
||||
, haskeline >=0.6
|
||||
, hledger-lib >=1.26.99 && <1.27
|
||||
, hledger-lib >=1.27.1 && <1.28
|
||||
, lucid
|
||||
, math-functions >=0.3.3.0
|
||||
, megaparsec >=7.0.0 && <9.3
|
||||
@ -186,7 +186,7 @@ executable hledger
|
||||
hs-source-dirs:
|
||||
app
|
||||
ghc-options: -Wall -Wno-incomplete-uni-patterns -Wno-missing-signatures -Wno-orphans -Wno-type-defaults -Wno-unused-do-bind -optP-Wno-nonportable-include-path
|
||||
cpp-options: -DVERSION="1.26.99"
|
||||
cpp-options: -DVERSION="1.27.1"
|
||||
build-depends:
|
||||
Decimal >=0.5.1
|
||||
, aeson >=1
|
||||
@ -203,7 +203,7 @@ executable hledger
|
||||
, githash >=0.1.6.1
|
||||
, haskeline >=0.6
|
||||
, hledger
|
||||
, hledger-lib >=1.26.99 && <1.27
|
||||
, hledger-lib >=1.27.1 && <1.28
|
||||
, math-functions >=0.3.3.0
|
||||
, megaparsec >=7.0.0 && <9.3
|
||||
, microlens >=0.4
|
||||
@ -237,7 +237,7 @@ test-suite unittest
|
||||
hs-source-dirs:
|
||||
test
|
||||
ghc-options: -Wall -Wno-incomplete-uni-patterns -Wno-missing-signatures -Wno-orphans -Wno-type-defaults -Wno-unused-do-bind -optP-Wno-nonportable-include-path
|
||||
cpp-options: -DVERSION="1.26.99"
|
||||
cpp-options: -DVERSION="1.27.1"
|
||||
build-depends:
|
||||
Decimal >=0.5.1
|
||||
, aeson >=1
|
||||
@ -254,7 +254,7 @@ test-suite unittest
|
||||
, githash >=0.1.6.1
|
||||
, haskeline >=0.6
|
||||
, hledger
|
||||
, hledger-lib >=1.26.99 && <1.27
|
||||
, hledger-lib >=1.27.1 && <1.28
|
||||
, math-functions >=0.3.3.0
|
||||
, megaparsec >=7.0.0 && <9.3
|
||||
, microlens >=0.4
|
||||
@ -303,7 +303,7 @@ benchmark bench
|
||||
, githash >=0.1.6.1
|
||||
, haskeline >=0.6
|
||||
, hledger
|
||||
, hledger-lib >=1.26.99 && <1.27
|
||||
, hledger-lib >=1.27.1 && <1.28
|
||||
, html
|
||||
, math-functions >=0.3.3.0
|
||||
, megaparsec >=7.0.0 && <9.3
|
||||
|
||||
1640
hledger/hledger.info
1640
hledger/hledger.info
File diff suppressed because it is too large
Load Diff
2423
hledger/hledger.txt
2423
hledger/hledger.txt
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,5 @@
|
||||
name: hledger
|
||||
version: 1.26.99
|
||||
version: 1.27.1
|
||||
synopsis: Command-line interface for the hledger accounting system
|
||||
description: |
|
||||
The command-line interface for the hledger accounting system.
|
||||
@ -97,7 +97,7 @@ ghc-options:
|
||||
|
||||
dependencies:
|
||||
- base >=4.14 && <4.17
|
||||
- hledger-lib >=1.26.99 && <1.27
|
||||
- hledger-lib >=1.27.1 && <1.28
|
||||
- aeson >=1
|
||||
- ansi-terminal >=0.9
|
||||
- breakpoint
|
||||
@ -138,7 +138,7 @@ when:
|
||||
- terminfo
|
||||
|
||||
library:
|
||||
cpp-options: -DVERSION="1.26.99"
|
||||
cpp-options: -DVERSION="1.27.1"
|
||||
exposed-modules:
|
||||
- Hledger.Cli
|
||||
- Hledger.Cli.Main
|
||||
@ -187,7 +187,7 @@ executables:
|
||||
hledger:
|
||||
source-dirs: app
|
||||
main: hledger-cli.hs
|
||||
cpp-options: -DVERSION="1.26.99"
|
||||
cpp-options: -DVERSION="1.27.1"
|
||||
when:
|
||||
- condition: flag(threaded)
|
||||
ghc-options: -threaded
|
||||
@ -199,7 +199,7 @@ tests:
|
||||
source-dirs: test
|
||||
main: unittest.hs
|
||||
other-modules: [] # prevent double compilation, https://github.com/sol/hpack/issues/188
|
||||
cpp-options: -DVERSION="1.26.99"
|
||||
cpp-options: -DVERSION="1.27.1"
|
||||
dependencies:
|
||||
- hledger
|
||||
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
# 1.
|
||||
hledger -f sample.journal balance --tree
|
||||
>>>
|
||||
$ hledger -f sample.journal balance --tree
|
||||
$-1 assets
|
||||
$1 bank:saving
|
||||
$-2 cash
|
||||
@ -13,22 +12,18 @@ hledger -f sample.journal balance --tree
|
||||
$1 liabilities:debts
|
||||
--------------------
|
||||
0
|
||||
>>>=0
|
||||
|
||||
# 2.
|
||||
hledger -f sample.journal balance --tree o
|
||||
>>>
|
||||
$ hledger -f sample.journal balance --tree o
|
||||
$1 expenses:food
|
||||
$-2 income
|
||||
$-1 gifts
|
||||
$-1 salary
|
||||
--------------------
|
||||
$-1
|
||||
>>>=0
|
||||
|
||||
# 3. Period reporting works for a specific year
|
||||
hledger -f - balance -b 2016 -e 2017 -N
|
||||
<<<
|
||||
<
|
||||
2015/10/10 Client A | Invoice #1
|
||||
assets:receivables $10,000.00
|
||||
revenue:clients:A -$10,000.00
|
||||
@ -48,16 +43,13 @@ hledger -f - balance -b 2016 -e 2017 -N
|
||||
2016/03/01 Deposit | Invoice #2
|
||||
assets:checking $10.00
|
||||
assets:receivables -$10.00
|
||||
>>>
|
||||
$ hledger -f - balance -b 2016 -e 2017 -N
|
||||
$-40.00 assets:checking
|
||||
$50.00 expense:hosting
|
||||
$-10.00 revenue:clients:B
|
||||
>>>2
|
||||
>>>= 0
|
||||
|
||||
# 4. Period reporting works for two years
|
||||
hledger -f - balance --tree -b 2015 -e 2017 -N
|
||||
<<<
|
||||
<
|
||||
2015/10/10 Client A | Invoice #1
|
||||
assets:receivables $10,000.00
|
||||
revenue:clients:A -$10,000.00
|
||||
@ -77,18 +69,15 @@ hledger -f - balance --tree -b 2015 -e 2017 -N
|
||||
2016/03/01 Deposit | Invoice #2
|
||||
assets:checking $10.00
|
||||
assets:receivables -$10.00
|
||||
>>>
|
||||
$ hledger -f - balance --tree -b 2015 -e 2017 -N
|
||||
$9,960.00 assets:checking
|
||||
$50.00 expense:hosting
|
||||
$-10,010.00 revenue:clients
|
||||
$-10,000.00 A
|
||||
$-10.00 B
|
||||
>>>2
|
||||
>>>= 0
|
||||
|
||||
# 5. Period reporting works for one month
|
||||
hledger -f - balance --tree -b 2015/11 -e 2015/12 -N
|
||||
<<<
|
||||
<
|
||||
2015/10/10 Client A | Invoice #1
|
||||
assets:receivables $10,000.00
|
||||
revenue:clients:A -$10,000.00
|
||||
@ -108,16 +97,13 @@ hledger -f - balance --tree -b 2015/11 -e 2015/12 -N
|
||||
2016/03/01 Deposit | Invoice #2
|
||||
assets:checking $10.00
|
||||
assets:receivables -$10.00
|
||||
>>>
|
||||
$ hledger -f - balance --tree -b 2015/11 -e 2015/12 -N
|
||||
0 assets
|
||||
$10,000.00 checking
|
||||
$-10,000.00 receivables
|
||||
>>>2
|
||||
>>>= 0
|
||||
|
||||
# 6. Period reporting works for one month in another year
|
||||
hledger -f - balance -b 2016/10 -e 2016/11
|
||||
<<<
|
||||
<
|
||||
2015/10/10 Client A | Invoice #1
|
||||
assets:receivables $10,000.00
|
||||
revenue:clients:A -$10,000.00
|
||||
@ -137,88 +123,85 @@ hledger -f - balance -b 2016/10 -e 2016/11
|
||||
2016/03/01 Deposit | Invoice #2
|
||||
assets:checking $10.00
|
||||
assets:receivables -$10.00
|
||||
>>>
|
||||
$ hledger -f - balance -b 2016/10 -e 2016/11
|
||||
--------------------
|
||||
0
|
||||
>>>2
|
||||
>>>= 0
|
||||
|
||||
# 7. Default CSV output.
|
||||
hledger -f - balance -N --output-format=csv
|
||||
<<<
|
||||
<
|
||||
2021-01-01 Test
|
||||
Assets:ABC "AB.C" 1
|
||||
Assets:Cash -$1
|
||||
>>>
|
||||
$ hledger -f - balance -N --output-format=csv
|
||||
"account","balance"
|
||||
"Assets:ABC","""AB.C"" 1"
|
||||
"Assets:Cash","$-1"
|
||||
>>>= 0
|
||||
|
||||
# 8. CSV output always shows full account names, even in tree mode (#1565).
|
||||
hledger -f - balance -N --output-format=csv --tree
|
||||
<<<
|
||||
<
|
||||
2021-01-01 Test
|
||||
Assets:ABC "AB.C" 1
|
||||
Assets:Cash -$1
|
||||
>>>
|
||||
$ hledger -f - balance -N --output-format=csv --tree
|
||||
"account","balance"
|
||||
"Assets","$-1, ""AB.C"" 1"
|
||||
"Assets:ABC","""AB.C"" 1"
|
||||
"Assets:Cash","$-1"
|
||||
>>>= 0
|
||||
|
||||
# 9. CSV output always does not show thousands separators
|
||||
hledger -f - balance -N --output-format=csv
|
||||
<<<
|
||||
<
|
||||
2021-01-01 Test
|
||||
Assets:ABC $10 000.00
|
||||
Assets:Cash -$10 000.00
|
||||
>>>
|
||||
$ hledger -f - balance -N --output-format=csv
|
||||
"account","balance"
|
||||
"Assets:ABC","$10000.00"
|
||||
"Assets:Cash","$-10000.00"
|
||||
>>>= 0
|
||||
|
||||
# 10. --declared includes all declared leaf accounts, even if they have no postings.
|
||||
# They are filtered, depth-clipped, and form trees like the others.
|
||||
# (XXX Here a:ac is not declared and so not shown, even though normally a balance report clipped to depth 2 would show it. Wrong ?)
|
||||
hledger -f - balance -NE --declared --tree --depth 2 a
|
||||
<<<
|
||||
<
|
||||
account a
|
||||
account a:aa
|
||||
account a:ab
|
||||
account a:ac:aca
|
||||
account b
|
||||
>>>
|
||||
$ hledger -f - balance -NE --declared --tree --depth 2 a
|
||||
0 a
|
||||
0 aa
|
||||
0 ab
|
||||
>>>= 0
|
||||
|
||||
# 11. In list mode we can see that non-leaf declared accounts are excluded.
|
||||
hledger -f - balance -NE --declared --flat
|
||||
<<<
|
||||
<
|
||||
account a
|
||||
account a:aa
|
||||
account a:ab
|
||||
account a:ac:aca
|
||||
account b
|
||||
>>>
|
||||
$ hledger -f - balance -NE --declared --flat
|
||||
0 a:aa
|
||||
0 a:ab
|
||||
0 a:ac:aca
|
||||
0 b
|
||||
>>>= 0
|
||||
|
||||
# 12. not:ACCT queries work with declared accounts.
|
||||
hledger -f - balance -NE --declared not:a
|
||||
<<<
|
||||
<
|
||||
account a
|
||||
account a:aa
|
||||
account a:ab
|
||||
account a:ac:aca
|
||||
account b
|
||||
>>>
|
||||
$ hledger -f - balance -NE --declared not:a
|
||||
0 b
|
||||
>>>= 0
|
||||
|
||||
# 13. An empty periodic report in HTML output does not break.
|
||||
<
|
||||
$ hledger -f- bal -M -O html
|
||||
> //
|
||||
|
||||
# 14. An empty totals column in HTML output does not break (#1933).
|
||||
<
|
||||
$ hledger -f- bal -MT -O html
|
||||
> //
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
# 1. all data files on the command line should be read
|
||||
hledger inc -f personal.journal -f business.journal
|
||||
hledger is -f personal.journal -f business.journal
|
||||
>>>
|
||||
Income Statement 2014-01-01..2014-01-02
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user