implementation module ReviewTask

import iTasks

// (c) 2007 MJP

// A task is given to user 0
// When finished the result of the task is reviewed by user 1
// He can comment on the task, or approve or cancel it
// When the result needs more work, the whole process is repeated
// Otherwise the task is completed
// The task itself in the example is a quotation form that needs to be filled in

derive class iTask	QForm, Review, Person, Gender
derive bimap (,), Maybe

:: PersonData	=	{ name		:: String
					, e_mail	:: String
					}
:: SurfaceMail	=	{ adress 	:: String
					, zipcode 	:: String
					, city	 	:: String
					}

:: QForm = 	{ toComp 			:: String
			, startDate 		:: Date
			, endDate 			:: Date
			, estimatedHours 	:: Int
			, description		:: Note
			, price				:: Currency 	
			}
:: Person = { firstName			:: String
			 , surname			:: String
			 , dateOfBirth		:: Date
			 , gender			:: Gender
			 }
:: Gender = Male | Female
:: Review = Approved | Rejected | NeedsRework Note


reviewTaskExample :: [Workflow]
reviewTaskExample
= [workflow "Examples/Higher order/Review task" "Demo of an iterative process" (Subject "Review the results of a task" @>> reviewtask) ]

reviewtask :: Task (QForm,Review)
reviewtask = getDefaultValue >>= \def -> taskToReview AnyUser (def, mytask)

mytask :: a -> (Task a) | iTask a
mytask v =	updateInformation "Form" "Fill in Form:" v

taskToReview :: User (a,a -> Task a) -> Task (a,Review) | iTask a 
taskToReview reviewer (v`,task) 
	=					task v`               
		>>= \v ->		reviewer @: (Subject "Review" @>> review v) 
		>>= \r ->		showMessageAbout "Review" [Text ("Reviewer " <+++ reviewer <+++ " says ")] r 
		>>|				case r of
							(NeedsRework _) -> taskToReview reviewer (v,task) 	
							else            -> return (v,r)

review :: a -> Task Review | iTask a 
review v
	=	getDefaultValue
	>>=	\def ->
		enterChoiceAbout "Review" "What is your verdict?" v
			[ updateInformation "Comments" "Please add your comments" (NeedsRework def) <<@ Subject "Rework"
			, return Approved <<@ Subject "Approved"
			, return Rejected <<@ Subject "Reject"
			]
	>>= \task -> task