module Data.TTask.Command.Add
( newProject
, addNewStoryToPbl
, addNewStoryToSprints
, addNewSprint
, addNewTask
, addSprintToProject
, addStoryToPbl
, addStoryToPblFirst
, addStoryToPjSprints
, addTaskToProject
, getLocalTime
, projectsTaskMaxId
, projectStoryMaxId
, projectSprintMaxId
) where
import Control.Lens (over, (^.))
import Data.Time
import Data.List.Extra
import Data.Maybe
import Data.TTask.Types
import Safe
newProject :: String -> IO Project
newProject name = do
lt <- getLocalTime
return $ Project
{ _projectName = name
, _projectBacklog = []
, _projectSprints = []
, _projectStatus = TStatusOne $ StatusWait lt
}
newStory :: String -> Int -> IO UserStory
newStory description id = do
lt <- getLocalTime
return $ UserStory
{ _storyId = id
, _storyDescription = description
, _storyTasks = []
, _storyStatus = TStatusOne $ StatusWait lt
}
newTask :: String -> Point -> Id -> IO Task
newTask description point id = do
lt <- getLocalTime
return $ Task
{ _taskId = id
, _taskDescription = description
, _taskPoint = point
, _taskStatus = TStatusOne $ StatusWait lt
, _taskWorkTimes = []
}
newSprint :: String -> Id -> IO Sprint
newSprint description id = do
lt <- getLocalTime
return $ Sprint
{ _sprintId = id
, _sprintDescription = description
, _sprintStorys = []
, _sprintStatus = TStatusOne $ StatusWait lt
}
addNewStoryToPbl :: String -> Project -> IO Project
addNewStoryToPbl description pj = do
let nid = projectStoryMaxId pj + 1
us <- newStory description nid
return . over projectBacklog (flip snoc us) $ pj
addNewStoryToSprints :: Id -> String -> Project -> IO Project
addNewStoryToSprints spid description pj = do
let nid = projectStoryMaxId pj + 1
us <- newStory description nid
return $ addStoryToPjSprints spid us pj
addNewSprint :: String -> Project -> IO Project
addNewSprint description pj = do
let nid = projectSprintMaxId pj + 1
sp <- newSprint description nid
return $ addSprintToProject sp pj
addNewTask :: Point -> Id -> String -> Project -> IO Project
addNewTask point usid description pj = do
let nid = projectsTaskMaxId pj + 1
task <- newTask description point nid
return $ addTaskToProject usid task pj
addSprintToProject :: Sprint -> Project -> Project
addSprintToProject sp pj = pj { _projectSprints = snoc (_projectSprints pj) sp }
addStoryToPbl :: UserStory -> Project -> Project
addStoryToPbl us pj = pj { _projectBacklog = snoc (_projectBacklog pj) us }
addStoryToPblFirst :: UserStory -> Project -> Project
addStoryToPblFirst us pj = pj { _projectBacklog = us : _projectBacklog pj }
addStoryToPjSprints :: Id -> UserStory -> Project -> Project
addStoryToPjSprints i us pj = pj { _projectSprints = map (addStoryToSprint i us) $ _projectSprints pj }
addTaskToProject :: Id -> Task -> Project -> Project
addTaskToProject i task pj = pj
{ _projectBacklog = addTaskToStorys i task $ _projectBacklog pj
, _projectSprints = addTaskToSprintList i task $ _projectSprints pj
}
addStoryToSprint :: Id -> UserStory -> Sprint -> Sprint
addStoryToSprint id us sp = if _sprintId sp == id then
sp { _sprintStorys = snoc (_sprintStorys sp) us } else sp
addTaskToSprintList :: Id -> Task -> [Sprint] -> [Sprint]
addTaskToSprintList id task = map $ addTaskToSprint id task
addTaskToSprint :: Id -> Task -> Sprint -> Sprint
addTaskToSprint id task sp =
sp { _sprintStorys = addTaskToStorys id task $ _sprintStorys sp }
addTaskToStorys :: Id -> Task -> [UserStory] -> [UserStory]
addTaskToStorys id task = map $ addTaskToStory id task
addTaskToStory :: Id -> Task -> UserStory -> UserStory
addTaskToStory id task us = if _storyId us == id
then us { _storyTasks = snoc (_storyTasks us) task } else us
projectsTaskMaxIdMay :: Project -> Maybe Id
projectsTaskMaxIdMay = maximumMay . map _taskId . (^.allTasks)
projectsTaskMaxId :: Project -> Id
projectsTaskMaxId = fromMaybe 0 . projectsTaskMaxIdMay
projectStoryMaxIdMay :: Project -> Maybe Id
projectStoryMaxIdMay = maximumMay . map _storyId . (^.allStory)
projectStoryMaxId :: Project -> Id
projectStoryMaxId = fromMaybe 0 . projectStoryMaxIdMay
projectSprintMaxIdMay :: Project -> Maybe Id
projectSprintMaxIdMay = maximumMay . map _sprintId . _projectSprints
projectSprintMaxId :: Project -> Id
projectSprintMaxId = fromMaybe 0 . projectSprintMaxIdMay
getLocalTime :: IO LocalTime
getLocalTime = getZonedTime >>= return . zonedTimeToLocalTime