balance: show compact headings for common intervals

In periodic multicolumn balance reports, column headings now show a more
compact description of common periods (years, half-years, quarters,
months, weeks) for better readability and screen space efficiency.
This commit is contained in:
Simon Michael 2014-07-26 16:54:18 -07:00
parent 0b8b246fcd
commit a7f7c3181f
2 changed files with 80 additions and 49 deletions

View File

@ -66,6 +66,7 @@ import Data.Maybe
import Data.Time.Format import Data.Time.Format
import Data.Time.Calendar import Data.Time.Calendar
import Data.Time.Calendar.OrdinalDate import Data.Time.Calendar.OrdinalDate
import Data.Time.Calendar.WeekDate
import Data.Time.Clock import Data.Time.Clock
import Data.Time.LocalTime import Data.Time.LocalTime
import Safe (headMay, lastMay, readMay) import Safe (headMay, lastMay, readMay)
@ -85,7 +86,37 @@ instance Show DateSpan where
showDate :: Day -> String showDate :: Day -> String
showDate = formatTime defaultTimeLocale "%0C%y/%m/%d" showDate = formatTime defaultTimeLocale "%0C%y/%m/%d"
showDateSpan (DateSpan from to) = -- | Render a datespan as a display string, abbreviating into a
-- compact form if possible.
showDateSpan ds@(DateSpan (Just from) (Just to)) =
case (toGregorian from, toGregorian to) of
-- special cases we can abbreviate:
-- a year, YYYY
((fy,1,1), (ty,1,1)) | fy+1==ty -> formatTime defaultTimeLocale "%0C%y" from
-- a month, YYYY/MM
((fy,fm,1), (ty,tm,1)) | fy==ty && fm+1==tm -> formatTime defaultTimeLocale "%0C%y/%m" from
((fy,12,1), (ty,1,1)) | fy+1==ty -> formatTime defaultTimeLocale "%0C%y/%m" from
-- a quarter, YYYYqN
((fy,1,1), (ty,4,1)) | fy==ty -> formatTime defaultTimeLocale "%0C%yq1" from
((fy,4,1), (ty,7,1)) | fy==ty -> formatTime defaultTimeLocale "%0C%yq2" from
((fy,7,1), (ty,10,1)) | fy==ty -> formatTime defaultTimeLocale "%0C%yq3" from
((fy,10,1), (ty,1,1)) | fy+1==ty -> formatTime defaultTimeLocale "%0C%yq4" from
-- a half, YYYYhN
((fy,1,1), (ty,7,1)) | fy==ty -> formatTime defaultTimeLocale "%0C%yh1" from
((fy,7,1), (ty,1,1)) | fy+1==ty -> formatTime defaultTimeLocale "%0C%yh2" from
-- a week (two successive mondays),
-- YYYYwN ("week N of year YYYY")
-- _ | let ((fy,fw,fd), (ty,tw,td)) = (toWeekDate from, toWeekDate to) in fy==ty && fw+1==tw && fd==1 && td==1
-- -> formatTime defaultTimeLocale "%0f%gw%V" from
-- YYYY/MM/DDwN ("week N, starting on YYYY/MM/DD")
_ | let ((fy,fw,fd), (ty,tw,td)) = (toWeekDate from, toWeekDate to) in fy==ty && fw+1==tw && fd==1 && td==1
-> formatTime defaultTimeLocale "%0C%y/%m/%dw%V" from
-- otherwise, YYYY/MM/DD-YYYY/MM/DD
_ -> showDateSpan' ds
showDateSpan ds = showDateSpan' ds
-- | Render a datespan as a display string.
showDateSpan' (DateSpan from to) =
concat concat
[maybe "" showDate from [maybe "" showDate from
,"-" ,"-"

View File

@ -16,13 +16,13 @@ hledgerdev -f balance-multicol.journal balance -p 'monthly in 2013' --no-total
>>> >>>
Change of balance (flow): Change of balance (flow):
|| 2013/01/01-2013/01/31 2013/02/01-2013/02/28 2013/03/01-2013/03/31 || 2013/01 2013/02 2013/03
=================++====================================================================== =================++============================
assets || 0 1 0 assets || 0 1 0
assets:cash || 0 1 0 assets:cash || 0 1 0
assets:checking || 0 0 1 assets:checking || 0 0 1
-----------------++---------------------------------------------------------------------- -----------------++----------------------------
|| ||
>>>=0 >>>=0
@ -39,11 +39,11 @@ hledgerdev -f - balance -p 'quarterly in 2013' --empty
>>> >>>
Change of balance (flow): Change of balance (flow):
|| 2013/01/01-2013/03/31 2013/04/01-2013/06/30 2013/07/01-2013/09/30 2013/10/01-2013/12/31 || 2013q1 2013q2 2013q3 2013q4
===++============================================================================================= ===++=================================
a || 2 0 0 0 a || 2 0 0 0
---++--------------------------------------------------------------------------------------------- ---++---------------------------------
|| 2 0 0 0 || 2 0 0 0
>>>=0 >>>=0
@ -100,12 +100,12 @@ hledgerdev -f balance-multicol.journal balance -p 'monthly in 2013' not:assets$
>>> >>>
Change of balance (flow): Change of balance (flow):
|| 2013/01/01-2013/01/31 2013/02/01-2013/02/28 2013/03/01-2013/03/31 || 2013/01 2013/02 2013/03
=================++====================================================================== =================++============================
assets:cash || 0 1 0 assets:cash || 0 1 0
assets:checking || 0 0 1 assets:checking || 0 0 1
-----------------++---------------------------------------------------------------------- -----------------++----------------------------
|| 0 1 1 || 0 1 1
>>>=0 >>>=0
@ -145,11 +145,11 @@ hledgerdev -f balance-multicol.journal balance -p 'monthly in 2013' --depth 1
>>> >>>
Change of balance (flow): Change of balance (flow):
|| 2013/01/01-2013/01/31 2013/02/01-2013/02/28 2013/03/01-2013/03/31 || 2013/01 2013/02 2013/03
========++====================================================================== ========++============================
assets || 0 2 1 assets || 0 2 1
--------++---------------------------------------------------------------------- --------++----------------------------
|| 0 2 1 || 0 2 1
>>>=0 >>>=0
@ -158,11 +158,11 @@ hledgerdev -f balance-multicol.journal balance -p 'monthly in 2013' --depth 1 as
>>> >>>
Change of balance (flow): Change of balance (flow):
|| 2013/01/01-2013/01/31 2013/02/01-2013/02/28 2013/03/01-2013/03/31 || 2013/01 2013/02 2013/03
========++====================================================================== ========++============================
assets || 0 1 1 assets || 0 1 1
--------++---------------------------------------------------------------------- --------++----------------------------
|| 0 1 1 || 0 1 1
>>>=0 >>>=0
@ -197,13 +197,13 @@ hledgerdev -f balance-multicol.journal balance -p 'monthly in 2013' --tree
>>> >>>
Change of balance (flow): Change of balance (flow):
|| 2013/01/01-2013/01/31 2013/02/01-2013/02/28 2013/03/01-2013/03/31 || 2013/01 2013/02 2013/03
============++====================================================================== ============++============================
assets || 0 2 1 assets || 0 2 1
cash || 0 1 0 cash || 0 1 0
checking || 0 0 1 checking || 0 0 1
------------++---------------------------------------------------------------------- ------------++----------------------------
|| 0 2 1 || 0 2 1
>>>=0 >>>=0
@ -249,12 +249,12 @@ hledgerdev -f- balance --monthly --date2
>>> >>>
Change of balance (flow): Change of balance (flow):
|| 2014/01/01-2014/01/31 || 2014/01
===++======================== ===++==========
a || 1 a || 1
b || 1 b || 1
---++------------------------ ---++----------
|| 2 || 2
>>>=0 >>>=0
@ -273,12 +273,12 @@ hledgerdev -f- balance -p 'monthly 2014/1/10-2014/2/20'
>>> >>>
Change of balance (flow): Change of balance (flow):
|| 2014/01/01-2014/01/31 2014/02/01-2014/02/28 || 2014/01 2014/02
========++=============================================== ========++===================
after || 0 1 after || 0 1
before || 1 0 before || 1 0
within || 0 1 within || 0 1
--------++----------------------------------------------- --------++-------------------
|| 1 2 || 1 2
>>>=0 >>>=0