imp: timeclock: support comments and tags (fix #1220)

Breaking change: previously timeclock descriptions could contain
semicolons. Now a semicolon in the description will end it and
start a comment (which may contain tags).
This commit is contained in:
Simon Michael 2023-05-02 23:35:16 -10:00
parent f7f86a709b
commit 50349f81f7
6 changed files with 48 additions and 28 deletions

View File

@ -2,5 +2,5 @@ i 2009/03/27 09:00:00 projects:a
o 2009/03/27 17:00:34
i 2009/03/31 22:21:45 personal:reading:online
o 2009/04/01 02:00:34
i 2009/04/02 09:00:00 projects:b
i 2009/04/02 09:00:00 projects:b ; a comment, with tag:
o 2009/04/02 17:00:34

View File

@ -57,7 +57,7 @@ timeclockEntriesToTransactions now [i]
| odate > idate = entryFromTimeclockInOut i o' : timeclockEntriesToTransactions now [i',o]
| otherwise = [entryFromTimeclockInOut i o]
where
o = TimeclockEntry (tlsourcepos i) Out end "" ""
o = TimeclockEntry (tlsourcepos i) Out end "" "" "" []
end = if itime > now then itime else now
(itime,otime) = (tldatetime i,tldatetime o)
(idate,odate) = (localDay itime,localDay otime)
@ -120,8 +120,8 @@ entryFromTimeclockInOut i o
tstatus = Cleared,
tcode = "",
tdescription = desc,
tcomment = "",
ttags = [],
tcomment = tlcomment i,
ttags = tltags i,
tpostings = ps,
tprecedingcomment=""
}
@ -162,11 +162,11 @@ tests_Timeclock = testGroup "Timeclock" [
future = utcToLocalTime tz $ addUTCTime 100 now'
futurestr = showtime future
step "started yesterday, split session at midnight"
txndescs [clockin (mktime yesterday "23:00:00") "" ""] @?= ["23:00-23:59","00:00-"++nowstr]
txndescs [clockin (mktime yesterday "23:00:00") "" "" "" []] @?= ["23:00-23:59","00:00-"++nowstr]
step "split multi-day sessions at each midnight"
txndescs [clockin (mktime (addDays (-2) today) "23:00:00") "" ""] @?= ["23:00-23:59","00:00-23:59","00:00-"++nowstr]
txndescs [clockin (mktime (addDays (-2) today) "23:00:00") "" "" "" []] @?= ["23:00-23:59","00:00-23:59","00:00-"++nowstr]
step "auto-clock-out if needed"
txndescs [clockin (mktime today "00:00:00") "" ""] @?= ["00:00-"++nowstr]
txndescs [clockin (mktime today "00:00:00") "" "" "" []] @?= ["00:00-"++nowstr]
step "use the clockin time for auto-clockout if it's in the future"
txndescs [clockin future "" ""] @?= [printf "%s-%s" futurestr futurestr]
txndescs [clockin future "" "" "" []] @?= [printf "%s-%s" futurestr futurestr]
]

View File

@ -504,7 +504,9 @@ data TimeclockEntry = TimeclockEntry {
tlcode :: TimeclockCode,
tldatetime :: LocalTime,
tlaccount :: AccountName,
tldescription :: Text
tldescription :: Text,
tlcomment :: Text,
tltags :: [Tag]
} deriving (Eq,Ord,Generic)
-- | A market price declaration made by the journal format's P directive.

View File

@ -45,7 +45,6 @@ i, o or O. The meanings of the codes are:
--- ** language
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PackageImports #-}
--- ** exports
module Hledger.Read.TimeclockReader (
@ -62,13 +61,13 @@ import Control.Monad.Except (ExceptT, liftEither)
import Control.Monad.State.Strict
import Data.Maybe (fromMaybe)
import Data.Text (Text)
import qualified Data.Text as T
import Text.Megaparsec hiding (parse)
import Hledger.Data
-- XXX too much reuse ?
import Hledger.Read.Common
import Hledger.Utils
import Data.Text as T (strip)
--- ** doctest setup
-- $setup
@ -119,10 +118,11 @@ timeclockfilep = do many timeclockitemp
-- | Parse a timeclock entry.
timeclockentryp :: JournalParser m TimeclockEntry
timeclockentryp = do
sourcepos <- getSourcePos
pos <- getSourcePos
code <- oneOf ("bhioO" :: [Char])
lift skipNonNewlineSpaces1
datetime <- datetimep
account <- fromMaybe "" <$> optional (lift skipNonNewlineSpaces1 >> modifiedaccountnamep)
description <- T.pack . fromMaybe "" <$> lift (optional (skipNonNewlineSpaces1 >> restofline))
return $ TimeclockEntry sourcepos (read [code]) datetime account description
account <- fmap (fromMaybe "") $ optional $ lift skipNonNewlineSpaces1 >> modifiedaccountnamep
description <- fmap (maybe "" T.strip) $ optional $ lift $ skipNonNewlineSpaces1 >> descriptionp
(comment, tags) <- lift transactioncommentp
return $ TimeclockEntry pos (read [code]) datetime account description comment tags

View File

@ -4111,9 +4111,9 @@ The timezone, if present, must be four digits and is ignored
Lines beginning with `#` or `;` or `*`, and blank lines, are ignored.
```timeclock
i 2015/03/30 09:00:00 some:account name optional description after two spaces
i 2015/03/30 09:00:00 some account optional description after 2 spaces ; optional comment, tags:
o 2015/03/30 09:20:00
i 2015/03/31 22:21:45 another account
i 2015/03/31 22:21:45 another:account
o 2015/04/01 02:00:34
```
@ -4124,14 +4124,14 @@ the above time log, `hledger print` generates these journal entries:
``` shell
$ hledger -f t.timeclock print
2015-03-30 * optional description after two spaces
(some:account name) 0.33h
2015-03-30 * optional description after 2 spaces ; optional comment, tags:
(some account) 0.33h
2015-03-31 * 22:21-23:59
(another account) 1.64h
(another:account) 1.64h
2015-04-01 * 00:00-02:00
(another account) 2.01h
(another:account) 2.01h
```

View File

@ -1,5 +1,4 @@
# 1. a timeclock session is parsed as a similarly-named transaction with one virtual posting.
# Note since 1.17 we need to specify stdin's format explicitly.
<
i 2009/1/1 08:00:00
o 2009/1/1 09:00:00 stuff on checkout record is ignored
@ -8,6 +7,7 @@ i 2009/1/2 08:00:00 account name
o 2009/1/2 09:00:00
i 2009/1/3 08:00:00 some:account name and a description
o 2009/1/3 09:00:00
$ hledger -f timeclock:- print
>
2009-01-01 * 08:00-09:00
@ -19,8 +19,7 @@ $ hledger -f timeclock:- print
2009-01-03 * and a description
(some:account name) 1.00h
>2
>= 0
>=
# 2. Command-line account aliases are applied.
$ hledger -ftimeclock:- print --alias '/account/=FOO'
@ -33,14 +32,14 @@ $ hledger -ftimeclock:- print --alias '/account/=FOO'
2009-01-03 * and a description
(some:FOO name) 1.00h
>= 0
>=
# 3. For a missing clock-out, now is implied
<
i 2020/1/1 08:00
$ hledger -f timeclock:- balance
> /./
>= 0
>=
# 4. For a log not starting with clock-out, print error
<
@ -60,14 +59,33 @@ $ hledger -f timeclock:- balance
# 6. Timeclock amounts are always rounded to two decimal places,
# even when displayed by print (#1527).
<
i 2020-01-30 08:38:35 a
i 2020-01-30 08:38:35 acct
o 2020-01-30 09:03:35
$ hledger -f timeclock:- print
2020-01-30 * 08:38-09:03
(a) 0.42h
(acct) 0.42h
>=
# 7. Comments and tags are supported. Double space is required between account name
# and description or comment. It is not required between description and comment.
<
i 2023-05-01 08:00:00 acct 1 description ; a comment with tag:
o 2023-05-01 09:00:00
i 2023-05-02 08:00:00 acct 2 ; another comment
o 2023-05-02 09:00:00
$ hledger -f timeclock:- print tag:tag
2023-05-01 * description ; a comment with tag:
(acct 1) 1.00h
>=
# 8.
$ hledger -f timeclock:- accounts
acct 1
acct 2
## TODO
## multi-day sessions get a new transaction for each day
#hledger -ftimeclock:- print