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''
|
Right j' -> Right j''
|
||||||
where
|
where
|
||||||
styles = journalCommodityStyles j'
|
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}
|
fixtransaction t@Transaction{tpostings=ps} = t{tpostings=map fixposting ps}
|
||||||
fixposting p = p{pamount=styleMixedAmount styles $ pamount p
|
fixposting p = p{pamount=styleMixedAmount styles $ pamount p
|
||||||
,pbalanceassertion=fixbalanceassertion <$> pbalanceassertion p}
|
,pbalanceassertion=fixbalanceassertion <$> pbalanceassertion p}
|
||||||
fixbalanceassertion ba = ba{baamount=styleAmount styles $ baamount ba}
|
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
|
-- | 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.
|
-- a commodity directive or inferred from amounts, as a map from symbol to style.
|
||||||
|
@ -6,6 +6,7 @@ module Hledger.Cli.Commands.Prices (
|
|||||||
)
|
)
|
||||||
where
|
where
|
||||||
|
|
||||||
|
import qualified Data.Map as M
|
||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Data.List
|
import Data.List
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
@ -26,11 +27,12 @@ pricesmode = hledgerCommandMode
|
|||||||
prices opts j = do
|
prices opts j = do
|
||||||
d <- getCurrentDay
|
d <- getCurrentDay
|
||||||
let
|
let
|
||||||
|
styles = journalCommodityStyles j
|
||||||
q = queryFromOpts d (reportopts_ opts)
|
q = queryFromOpts d (reportopts_ opts)
|
||||||
ps = filter (matchesPosting q) $ allPostings j
|
ps = filter (matchesPosting q) $ allPostings j
|
||||||
mprices = jpricedirectives j
|
mprices = jpricedirectives j
|
||||||
cprices = concatMap postingCosts ps
|
cprices = map (stylePriceDirectiveExceptPrecision styles) $ concatMap postingsPriceDirectivesFromCosts ps
|
||||||
icprices = concatMap postingCosts . mapAmount invertPrice $ ps
|
icprices = map (stylePriceDirectiveExceptPrecision styles) $ concatMap postingsPriceDirectivesFromCosts $ mapAmount invertPrice ps
|
||||||
allprices = mprices ++ ifBoolOpt "costs" cprices ++ ifBoolOpt "inverted-costs" icprices
|
allprices = mprices ++ ifBoolOpt "costs" cprices ++ ifBoolOpt "inverted-costs" icprices
|
||||||
mapM_ (putStrLn . showPriceDirective) $
|
mapM_ (putStrLn . showPriceDirective) $
|
||||||
sortOn pddate $
|
sortOn pddate $
|
||||||
@ -65,8 +67,12 @@ invertPrice a =
|
|||||||
a { aquantity = aquantity pa * signum (aquantity a), acommodity = acommodity pa, aprice = Just $ TotalPrice pa' } where
|
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 }
|
pa' = pa { aquantity = abs $ aquantity a, acommodity = acommodity a, aprice = Nothing, astyle = astyle a }
|
||||||
|
|
||||||
amountCost :: Day -> Amount -> Maybe PriceDirective
|
postingsPriceDirectivesFromCosts :: Posting -> [PriceDirective]
|
||||||
amountCost d a =
|
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
|
case aprice a of
|
||||||
Nothing -> Nothing
|
Nothing -> Nothing
|
||||||
Just (UnitPrice pa) -> Just
|
Just (UnitPrice pa) -> Just
|
||||||
@ -74,9 +80,12 @@ amountCost d a =
|
|||||||
Just (TotalPrice pa) -> Just
|
Just (TotalPrice pa) -> Just
|
||||||
PriceDirective { pddate = d, pdcommodity = acommodity a, pdamount = abs (aquantity a) `divideAmount'` pa }
|
PriceDirective { pddate = d, pdcommodity = acommodity a, pdamount = abs (aquantity a) `divideAmount'` pa }
|
||||||
|
|
||||||
postingCosts :: Posting -> [PriceDirective]
|
-- | Given a map of standard amount display styles, apply the
|
||||||
postingCosts p = mapMaybe (amountCost date) . amounts $ pamount p where
|
-- appropriate one, if any, to this price directive's amount.
|
||||||
date = fromMaybe (tdate . fromJust $ ptransaction p) $ pdate p
|
-- 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 :: Journal -> [Posting]
|
||||||
allPostings = concatMap tpostings . jtxns
|
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 --costs, also print synthetic market prices based on [transaction prices](/manual#transaction-prices).
|
||||||
With --inverted-costs, also print inverse prices based on transaction prices.
|
With --inverted-costs, also print inverse prices based on transaction prices.
|
||||||
Prices (and postings providing prices) can be filtered by a query.
|
Prices (and postings providing prices) can be filtered by a query.
|
||||||
|
Price amounts are always displayed with their full precision.
|
||||||
|
|
||||||
_FLAGS_
|
_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/1/1 EUR $1.06
|
||||||
P 2016/2/1 EUR $1.05
|
P 2016/2/1 EUR $1.05
|
||||||
@ -15,7 +15,7 @@ $ hledger prices -f-
|
|||||||
P 2016-01-01 EUR $1.06
|
P 2016-01-01 EUR $1.06
|
||||||
P 2016-02-01 EUR $1.05
|
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/1/1 EUR $1.06
|
||||||
P 2016/2/1 EUR $1.05
|
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-01-03 EUR $1.0725
|
||||||
P 2016-02-01 EUR $1.05
|
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/1/1 EUR $1.06
|
||||||
P 2016/2/1 EUR $1.05
|
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-01 EUR $1.06
|
||||||
P 2016-01-03 EUR $1.0725
|
P 2016-01-03 EUR $1.0725
|
||||||
P 2016-02-01 EUR $1.05
|
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