{-| A 'TimeLog' is a parsed timelog file (generated by timeclock.el), 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.Currency import Ledger.Amount import Ledger.RawTransaction import Ledger.Entry import Ledger.RawLedger instance Show TimeLogEntry where show t = printf "%s %s %s" (show $ tlcode t) (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. -- "Now" would be preferable but requires IO, for now use the clockin time. clockoutFor (TimeLogEntry _ t _) = TimeLogEntry 'o' t "" -- | Convert a timelog clockin and clockout entry to an equivalent ledger -- entry, representing the time expenditure. entryFromTimeLogInOut :: TimeLogEntry -> TimeLogEntry -> Entry entryFromTimeLogInOut i o = Entry { edate = indate, -- ledger uses outdate estatus = True, ecode = "", edescription = acctname, ecomment = "", etransactions = txns, epreceding_comment_lines="" } where acctname = tlcomment i indate = showDateFrom intime outdate = showDateFrom outtime intime = parsedatetime $ tldatetime i outtime = parsedatetime $ tldatetime o hours = fromRational (toRational (diffUTCTime outtime intime) / 3600) -- whatever.. amount = Amount (getcurrency "h") hours 1 txns = [RawTransaction acctname amount "", RawTransaction "assets:TIME" (-amount) ""] showDateFrom :: UTCTime -> String showDateFrom = formatTime defaultTimeLocale "%Y/%m/%d"