mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-08 07:09:28 +03:00
514f015849
This patch replaces the strings used in the Entry, TimeLogEntry, and Transaction records with real types. Rather than use the inbuild system date and time types directly, two custom types have been implemented that wrap UTCTime: Date and DateTime. A minimal API for these has been added.
63 lines
2.2 KiB
Haskell
63 lines
2.2 KiB
Haskell
{-|
|
|
|
|
A 'TimeLog' is a parsed timelog file (see timeclock.el or the command-line
|
|
version) containing zero or more 'TimeLogEntry's. It can be converted to a
|
|
'RawLedger' for querying.
|
|
|
|
-}
|
|
|
|
module Ledger.TimeLog
|
|
where
|
|
import Ledger.Utils
|
|
import Ledger.Types
|
|
import Ledger.Commodity
|
|
import Ledger.Amount
|
|
|
|
|
|
instance Show TimeLogEntry where
|
|
show t = printf "%s %s %s" (show $ tlcode t) (show $ tldatetime t) (tlcomment t)
|
|
|
|
instance Show TimeLog where
|
|
show tl = printf "TimeLog with %d entries" $ length $ timelog_entries tl
|
|
|
|
-- | Convert a time log to a ledger.
|
|
ledgerFromTimeLog :: TimeLog -> RawLedger
|
|
ledgerFromTimeLog tl = RawLedger [] [] (entriesFromTimeLogEntries $ timelog_entries tl) ""
|
|
|
|
-- | Convert time log entries to ledger entries.
|
|
entriesFromTimeLogEntries :: [TimeLogEntry] -> [Entry]
|
|
entriesFromTimeLogEntries [] = []
|
|
entriesFromTimeLogEntries [i] = entriesFromTimeLogEntries [i, clockoutFor i]
|
|
entriesFromTimeLogEntries (i:o:rest) = [entryFromTimeLogInOut i o] ++ entriesFromTimeLogEntries rest
|
|
|
|
-- | When there is a trailing clockin entry, provide the missing clockout.
|
|
-- An entry for now is what we want but this requires IO so for now use
|
|
-- the clockin time, ie don't count the current clocked-in period.
|
|
clockoutFor :: TimeLogEntry -> TimeLogEntry
|
|
clockoutFor (TimeLogEntry _ t _) = TimeLogEntry 'o' t ""
|
|
|
|
-- | Convert a timelog clockin and clockout entry to an equivalent ledger
|
|
-- entry, representing the time expenditure. Note this entry is not balanced,
|
|
-- since we omit the \"assets:time\" transaction for simpler output.
|
|
entryFromTimeLogInOut :: TimeLogEntry -> TimeLogEntry -> Entry
|
|
entryFromTimeLogInOut i o =
|
|
Entry {
|
|
edate = indate, -- ledger uses outdate
|
|
estatus = True,
|
|
ecode = "",
|
|
edescription = "",
|
|
ecomment = "",
|
|
etransactions = txns,
|
|
epreceding_comment_lines=""
|
|
}
|
|
where
|
|
acctname = tlcomment i
|
|
indate = datetimeToDate intime
|
|
outdate = datetimeToDate outtime
|
|
intime = tldatetime i
|
|
outtime = tldatetime o
|
|
amount = Mixed [hours $ elapsedSeconds outtime intime / 3600]
|
|
txns = [RawTransaction acctname amount "" RegularTransaction
|
|
--,RawTransaction "assets:time" (-amount) "" RegularTransaction
|
|
]
|