mirror of
https://github.com/simonmichael/hledger.git
synced 2024-09-20 02:37:12 +03:00
prices: style price amounts; always show full precision
This commit is contained in:
parent
b598f30a8a
commit
312e772468
@ -914,12 +914,14 @@ journalApplyCommodityStyles j@Journal{jtxns=ts, jpricedirectives=pds} =
|
||||
Right j' -> Right j''
|
||||
where
|
||||
styles = journalCommodityStyles j'
|
||||
j'' = j'{jtxns=map fixtransaction ts, jpricedirectives=map fixpricedirective pds}
|
||||
j'' = j'{jtxns=map fixtransaction ts
|
||||
,jpricedirectives=map fixpricedirective pds
|
||||
}
|
||||
fixtransaction t@Transaction{tpostings=ps} = t{tpostings=map fixposting ps}
|
||||
fixposting p = p{pamount=styleMixedAmount styles $ pamount p
|
||||
,pbalanceassertion=fixbalanceassertion <$> pbalanceassertion p}
|
||||
fixbalanceassertion ba = ba{baamount=styleAmount styles $ baamount ba}
|
||||
fixpricedirective pd@PriceDirective{pdamount=a} = pd{pdamount=styleAmount styles a}
|
||||
fixpricedirective pd@PriceDirective{pdamount=a} = pd{pdamount=styleAmountExceptPrecision styles a}
|
||||
|
||||
-- | Get all the amount styles defined in this journal, either declared by
|
||||
-- a commodity directive or inferred from amounts, as a map from symbol to style.
|
||||
|
@ -6,6 +6,7 @@ module Hledger.Cli.Commands.Prices (
|
||||
)
|
||||
where
|
||||
|
||||
import qualified Data.Map as M
|
||||
import Data.Maybe
|
||||
import Data.List
|
||||
import qualified Data.Text as T
|
||||
@ -26,11 +27,12 @@ pricesmode = hledgerCommandMode
|
||||
prices opts j = do
|
||||
d <- getCurrentDay
|
||||
let
|
||||
styles = journalCommodityStyles j
|
||||
q = queryFromOpts d (reportopts_ opts)
|
||||
ps = filter (matchesPosting q) $ allPostings j
|
||||
mprices = jpricedirectives j
|
||||
cprices = concatMap postingCosts ps
|
||||
icprices = concatMap postingCosts . mapAmount invertPrice $ ps
|
||||
cprices = map (stylePriceDirectiveExceptPrecision styles) $ concatMap postingsPriceDirectivesFromCosts ps
|
||||
icprices = map (stylePriceDirectiveExceptPrecision styles) $ concatMap postingsPriceDirectivesFromCosts $ mapAmount invertPrice ps
|
||||
allprices = mprices ++ ifBoolOpt "costs" cprices ++ ifBoolOpt "inverted-costs" icprices
|
||||
mapM_ (putStrLn . showPriceDirective) $
|
||||
sortOn pddate $
|
||||
@ -65,8 +67,12 @@ invertPrice a =
|
||||
a { aquantity = aquantity pa * signum (aquantity a), acommodity = acommodity pa, aprice = Just $ TotalPrice pa' } where
|
||||
pa' = pa { aquantity = abs $ aquantity a, acommodity = acommodity a, aprice = Nothing, astyle = astyle a }
|
||||
|
||||
amountCost :: Day -> Amount -> Maybe PriceDirective
|
||||
amountCost d a =
|
||||
postingsPriceDirectivesFromCosts :: Posting -> [PriceDirective]
|
||||
postingsPriceDirectivesFromCosts p = mapMaybe (amountPriceDirectiveFromCost date) . amounts $ pamount p where
|
||||
date = fromMaybe (tdate . fromJust $ ptransaction p) $ pdate p
|
||||
|
||||
amountPriceDirectiveFromCost :: Day -> Amount -> Maybe PriceDirective
|
||||
amountPriceDirectiveFromCost d a =
|
||||
case aprice a of
|
||||
Nothing -> Nothing
|
||||
Just (UnitPrice pa) -> Just
|
||||
@ -74,9 +80,12 @@ amountCost d a =
|
||||
Just (TotalPrice pa) -> Just
|
||||
PriceDirective { pddate = d, pdcommodity = acommodity a, pdamount = abs (aquantity a) `divideAmount'` pa }
|
||||
|
||||
postingCosts :: Posting -> [PriceDirective]
|
||||
postingCosts p = mapMaybe (amountCost date) . amounts $ pamount p where
|
||||
date = fromMaybe (tdate . fromJust $ ptransaction p) $ pdate p
|
||||
-- | Given a map of standard amount display styles, apply the
|
||||
-- appropriate one, if any, to this price directive's amount.
|
||||
-- But keep the number of decimal places unchanged.
|
||||
stylePriceDirectiveExceptPrecision :: M.Map CommoditySymbol AmountStyle -> PriceDirective -> PriceDirective
|
||||
stylePriceDirectiveExceptPrecision styles pd@PriceDirective{pdamount=a} =
|
||||
pd{pdamount = styleAmountExceptPrecision styles a}
|
||||
|
||||
allPostings :: Journal -> [Posting]
|
||||
allPostings = concatMap tpostings . jtxns
|
||||
|
@ -3,5 +3,6 @@ Print [market price directives](/manual#market-prices) from the journal.
|
||||
With --costs, also print synthetic market prices based on [transaction prices](/manual#transaction-prices).
|
||||
With --inverted-costs, also print inverse prices based on transaction prices.
|
||||
Prices (and postings providing prices) can be filtered by a query.
|
||||
Price amounts are always displayed with their full precision.
|
||||
|
||||
_FLAGS_
|
||||
|
@ -1,4 +1,4 @@
|
||||
# by default only market prices are reported
|
||||
# 1. by default only market prices are reported
|
||||
<
|
||||
P 2016/1/1 EUR $1.06
|
||||
P 2016/2/1 EUR $1.05
|
||||
@ -15,7 +15,7 @@ $ hledger prices -f-
|
||||
P 2016-01-01 EUR $1.06
|
||||
P 2016-02-01 EUR $1.05
|
||||
|
||||
# costs from postings can be included also
|
||||
# 2. costs from postings can be included also
|
||||
<
|
||||
P 2016/1/1 EUR $1.06
|
||||
P 2016/2/1 EUR $1.05
|
||||
@ -38,7 +38,7 @@ P 2016-01-02 EUR $1.07
|
||||
P 2016-01-03 EUR $1.0725
|
||||
P 2016-02-01 EUR $1.05
|
||||
|
||||
# inverted costs from postings can be calculated
|
||||
# 3. inverted costs from postings can be calculated
|
||||
<
|
||||
P 2016/1/1 EUR $1.06
|
||||
P 2016/2/1 EUR $1.05
|
||||
@ -55,3 +55,28 @@ $ hledger prices -f- --inverted-costs
|
||||
P 2016-01-01 EUR $1.06
|
||||
P 2016-01-03 EUR $1.0725
|
||||
P 2016-02-01 EUR $1.05
|
||||
|
||||
#
|
||||
<
|
||||
commodity 1.000,00 A
|
||||
|
||||
P 2019-01-01 X A1000,123
|
||||
P 2019-01-02 X A1000,1
|
||||
|
||||
2019-02-01
|
||||
(a) X1 @ A1000,2345
|
||||
2019-02-02
|
||||
(a) X1 @ A1000,2
|
||||
|
||||
# 4. Commodity styles are applied, but precision is left unchanged.
|
||||
$ hledger -f- prices
|
||||
P 2019-01-01 X 1.000,123 A
|
||||
P 2019-01-02 X 1.000,1 A
|
||||
|
||||
# 5. Commodity styles aren't yet applied to prices inferred from transaction prices.
|
||||
$ hledger -f- prices --costs
|
||||
P 2019-01-01 X 1.000,123 A
|
||||
P 2019-01-02 X 1.000,1 A
|
||||
P 2019-02-01 X 1.000,2345 A
|
||||
P 2019-02-02 X 1.000,2 A
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user