diff options
Diffstat (limited to 'duedatereport.hs')
-rw-r--r-- | duedatereport.hs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/duedatereport.hs b/duedatereport.hs new file mode 100644 index 0000000..80cc396 --- /dev/null +++ b/duedatereport.hs @@ -0,0 +1,62 @@ +import Control.Monad (liftM2) +import Data.List (sortBy) +import Data.Time.Calendar +import Data.Time.Clock +import Data.Time.Clock.POSIX (posixDayLength) +import Data.Time.Format +import qualified Data.Map as Map +import Data.Maybe +import Data.Yaml +import System.Locale (defaultTimeLocale) +import System.Environment (getArgs) + +fieldFilter :: String -> String -> Map.Map String String -> Bool +fieldFilter field val ymap = Map.lookup field ymap == Just val + +statusFilter :: String -> Map.Map String String -> Bool +statusFilter = fieldFilter "Status" + +assigneeFilter :: String -> Map.Map String String -> Bool +assigneeFilter = fieldFilter "AssignedTo" + +formatDeadline :: Map.Map String String -> String +formatDeadline ymap = user ++ "|" ++ date ++ "|" ++ filename + where + user = fromMaybe "ERROR" (Map.lookup "AssignedTo" ymap) + date = fromMaybe "ERROR" (Map.lookup "Date" ymap) + filename = fromMaybe "ERROR" (Map.lookup "filename" ymap) + +dateParse :: String -> UTCTime +dateParse x = fromMaybe (UTCTime (fromGregorian 0 1 1) (secondsToDiffTime 0)) $ parseTime defaultTimeLocale "%Y-%m-%d" x + +dateConv :: Map.Map String String -> UTCTime +dateConv ymap = dateParse (fromMaybe "1900-01-01" (Map.lookup "Date" ymap)) + +dateSorter :: Map.Map String String -> Map.Map String String -> Ordering +dateSorter amap bmap = compare (dateConv amap) (dateConv bmap) + +dateFilter :: (UTCTime -> Bool) -> Map.Map String String -> Bool +dateFilter func ymap = func (dateConv ymap) + +printIfNonEmpty :: String -> [Map.Map String String] -> IO () +printIfNonEmpty _ [] = return () +printIfNonEmpty title ymap = do + putStrLn title + putStrLn $ take (length title) (repeat '=') + mapM_ (putStrLn . formatDeadline) ymap + putStrLn "" + +main :: IO () +main = do + Just yamlcache <- decodeFile "/home/report/tmp/yamlcache.yaml" + currentTime <- getCurrentTime + args <- getArgs + let ymap = yamlcache + statusdue = filter (\m -> statusFilter "Due" m) ymap + userdue = if args == [] then statusdue else filter (\m -> elem (fromMaybe "UNASSIGNED" (Map.lookup "AssignedTo" m)) args) statusdue + buggtime = sortBy dateSorter $ filter (dateFilter (<UTCTime (fromGregorian 2010 1 1) (secondsToDiffTime 0))) userdue + beforenow = sortBy dateSorter $ filter (dateFilter (liftM2 (&&) (<currentTime) (>=UTCTime (fromGregorian 2010 1 1) (secondsToDiffTime 0)))) userdue + nexteightweeks = sortBy dateSorter $ filter (dateFilter (liftM2 (&&) (<(addUTCTime (56 * posixDayLength) currentTime)) (>=currentTime))) userdue + printIfNonEmpty "Malformed Due Date" buggtime + printIfNonEmpty "PAST DUE" beforenow + printIfNonEmpty "Upcoming" nexteightweeks |