summaryrefslogtreecommitdiff
path: root/duedatereport.hs
diff options
context:
space:
mode:
Diffstat (limited to 'duedatereport.hs')
-rw-r--r--duedatereport.hs62
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