split midnight-spanning timelog sessions. Accurate time reports at last!

This commit is contained in:
Simon Michael 2009-01-26 20:22:42 +00:00
parent ae5a9439d0
commit 564aba4976
2 changed files with 12 additions and 5 deletions

View File

@ -21,12 +21,20 @@ instance Show TimeLogEntry where
instance Show TimeLog where instance Show TimeLog where
show tl = printf "TimeLog with %d entries" $ length $ timelog_entries tl show tl = printf "TimeLog with %d entries" $ length $ timelog_entries tl
-- | Convert time log entries to ledger entries. When there is no clockout, -- | Convert time log entries to ledger entries. When there is no
-- add one with the provided current time. -- clockout, add one with the provided current time. Sessions crossing
-- midnight are split to give accurate per-day totals.
entriesFromTimeLogEntries :: LocalTime -> [TimeLogEntry] -> [Entry] entriesFromTimeLogEntries :: LocalTime -> [TimeLogEntry] -> [Entry]
entriesFromTimeLogEntries _ [] = [] entriesFromTimeLogEntries _ [] = []
entriesFromTimeLogEntries t [i] = [entryFromTimeLogInOut i (TimeLogEntry 'o' t "")] entriesFromTimeLogEntries t [i] = [entryFromTimeLogInOut i (TimeLogEntry 'o' t "")]
entriesFromTimeLogEntries t (i:o:rest) = [entryFromTimeLogInOut i o] ++ entriesFromTimeLogEntries t rest entriesFromTimeLogEntries t (i:o:rest)
| odate > idate = [entryFromTimeLogInOut i o'] ++ entriesFromTimeLogEntries t (i':o:rest)
| otherwise = [entryFromTimeLogInOut i o] ++ entriesFromTimeLogEntries t rest
where
(itime,otime) = (tldatetime i,tldatetime o)
(idate,odate) = (localDay itime,localDay otime)
o' = o{tldatetime=itime{localDay=idate, localTimeOfDay=TimeOfDay 23 59 59}}
i' = i{tldatetime=itime{localDay=addDays 1 idate, localTimeOfDay=midnight}}
-- | Convert a timelog clockin and clockout entry to an equivalent ledger -- | Convert a timelog clockin and clockout entry to an equivalent ledger
-- entry, representing the time expenditure. Note this entry is not balanced, -- entry, representing the time expenditure. Note this entry is not balanced,
@ -38,7 +46,7 @@ entryFromTimeLogInOut i o
error $ "clock-out time less than clock-in time in:\n" ++ showEntry e error $ "clock-out time less than clock-in time in:\n" ++ showEntry e
where where
e = Entry { e = Entry {
edate = odate, -- like ledger edate = idate,
estatus = True, estatus = True,
ecode = "", ecode = "",
edescription = showtime itod ++ "-" ++ showtime otod, edescription = showtime itod ++ "-" ++ showtime otod,

1
NOTES
View File

@ -55,7 +55,6 @@ clever tricks like the plague." --Edsger Dijkstra
**** charts **** charts
**** easier data entry **** easier data entry
**** parse more file formats - gnucash, qif, ofx, csv.. **** parse more file formats - gnucash, qif, ofx, csv..
**** split day-spanning timelog sessions, don't report more than 24 hours in a day
**** easier timelog format **** easier timelog format
**** i18n **** i18n
*** speed *** speed