summaryrefslogtreecommitdiff
path: root/duedatereport.hs
blob: 80cc39611b1d00910e32d6fed3f898e5a32f88a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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