<?xml version="1.0" encoding="utf-8" ?>
<sqlMap>

<resultMap id="project-result" class="ProjectRecord">
	<result property="ID" column="ProjectID" type="integer"/>
	<result property="Name" column="Name" />
	<result property="Description" column="Description" />
	<result property="DateCreated" column="CreationDate" typeHandler="DateTime" />
	<result property="EstimateDuration" column="EstimateDuration" type="float" />
	<result property="CompletionDate" column="CompletionDate" typeHandler="DateTime" />
	<result property="CreatorUserName" column="CreatorID" />
	<result property="ManagerUserName" column="ManagerID" />
	<result property="ActualDuration" column="ActualDuration" type="float" />
</resultMap>

<select id="ProjectNameExists" resultClass="boolean">
	SELECT COUNT(Name) FROM projects WHERE Name = #value#
</select>

<insert id="CreateNewProject" parameterClass="ProjectRecord">
	INSERT INTO projects
	(Name, Description, CreationDate, EstimateDuration, CompletionDate, CreatorID, ManagerID)
	VALUES
	(#Name#, #Description#, php('date', 'Y-m-d H:i:s'), #EstimateDuration#,
		#CompletionDate, typeHandler=DateTime#, 
		#CreatorUserName#, #ManagerUserName#)
	<selectKey property="ID" type="post" resultClass="int">
		select LAST_INSERT_ROWID() as value
    </selectKey>
</insert>

<select id="GetProjectByID" parameterClass="integer" resultMap="project-result">
	SELECT 
		projects.ProjectID as ProjectID,
		projects.Name as Name,
		projects.Description as Description,
		projects.CreationDate as CreationDate,
		projects.EstimateDuration as EstimateDuration,
		projects.CompletionDate as CompletionDate,
		projects.CreatorID as CreatorID,
		projects.ManagerID as ManagerID,
		SUM(time_entry.Duration) as ActualDuration
	FROM projects
		LEFT JOIN categories ON projects.ProjectID = categories.ProjectID
		LEFT JOIN time_entry ON categories.CategoryID = time_entry.CategoryID
	WHERE 
			projects.ProjectID = #value# 
		AND Disabled = 0
	GROUP BY
		projects.ProjectID
	ORDER BY
		projects.Name
</select>

<select id="GetAllProjects" resultMap="project-result">
	SELECT 
		projects.ProjectID as ProjectID,
		projects.Name as Name,
		projects.Description as Description,
		projects.CreationDate as CreationDate,
		projects.EstimateDuration as EstimateDuration,
		projects.CompletionDate as CompletionDate,
		projects.CreatorID as CreatorID,
		projects.ManagerID as ManagerID,
		SUM(time_entry.Duration) as ActualDuration
	FROM projects
		LEFT JOIN categories ON projects.ProjectID = categories.ProjectID
		LEFT JOIN time_entry ON categories.CategoryID = time_entry.CategoryID
	WHERE 
		Disabled = 0
	GROUP BY
		projects.ProjectID
	ORDER BY
		projects.ProjectID ASC
</select>

<select id="GetAllProjectsOrdered" resultMap="project-result" extends="GetAllProjects">
	ORDER BY $sort$ $order$
</select>

<select id="GetProjectsByManagerName" resultMap="project-result">
	SELECT 
		projects.ProjectID as ProjectID,
		projects.Name as Name,
		projects.Description as Description,
		projects.CreationDate as CreationDate,
		projects.EstimateDuration as EstimateDuration,
		projects.CompletionDate as CompletionDate,
		projects.CreatorID as CreatorID,
		projects.ManagerID as ManagerID,
		SUM(time_entry.Duration) as ActualDuration
	FROM projects
		LEFT JOIN categories ON projects.ProjectID = categories.ProjectID
		LEFT JOIN time_entry ON categories.CategoryID = time_entry.CategoryID
	WHERE 
			Disabled = 0 
		AND projects.ManagerID = #value#
	GROUP BY
		projects.ProjectID
	ORDER BY
		projects.Name
</select>

<select id="GetProjectsByUserName" resultMap="project-result">
	SELECT 
		projects.ProjectID as ProjectID,
		projects.Name as Name,
		projects.Description as Description,
		projects.CreationDate as CreationDate,
		projects.EstimateDuration as EstimateDuration,
		projects.CompletionDate as CompletionDate,
		projects.CreatorID as CreatorID,
		projects.ManagerID as ManagerID,
		SUM(time_entry.Duration) as ActualDuration
	FROM projects
		LEFT JOIN categories ON projects.ProjectID = categories.ProjectID
		LEFT JOIN time_entry ON categories.CategoryID = time_entry.CategoryID,
		project_members
	WHERE 
			project_members.ProjectID = projects.ProjectID
		AND project_members.UserID = #value#
		AND projects.Disabled = 0
	GROUP BY
		projects.ProjectID
	ORDER BY
		projects.Name
</select>

<update id="DeleteProject" parameterClass="integer">
	UPDATE projects SET Disabled = 1 WHERE ProjectID = #value#
</update>

<select id="GetProjectMembers" parameterClass="integer">
	SELECT UserID FROM project_members WHERE ProjectID = #value#
	ORDER BY UserID
</select>

<insert id="AddUserToProject" parameterClass="array">
	INSERT INTO project_members (UserID, ProjectID)
	VALUES(#username#, #project#)
</insert>

<delete id="RemoveUserFromProject" parameterClass="array">
	DELETE FROM project_members WHERE ProjectID = #project# AND UserID = #username#
</delete>

<update id="UpdateProject" parameterClass="ProjectRecord">
	UPDATE projects
	SET 
		CompletionDate = #CompletionDate, typeHandler=DateTime#,
		Description = #Description#,
		EstimateDuration = #EstimateDuration#,
		ManagerId =#ManagerUserName#,
		Name = #Name#
	WHERE 
		ProjectID = #ID#
</update>

</sqlMap>