[evolvis-commits] r7132: [#613] Idee: reporting-Werkzeug i =?UTF-8?Q?ntegrieren=E2=86=B5=20Backup=20?==?UTF-8?Q?commit?=. works, but needs to be tested and optimized.

papel at evolvis.org papel at evolvis.org
Wed Dec 22 16:12:34 CET 2010


Author: papel
Date: 2010-12-22 16:12:34 +0100 (Wed, 22 Dec 2010)
New Revision: 7132

Modified:
   branches/papel-reporting/common/pm/taskReportingController.class.php
   branches/papel-reporting/common/pm/taskReportingModel.class.php
Log:
[#613] Idee: reporting-Werkzeug integrieren
Backup commit. works, but needs to be tested and optimized.

Modified: branches/papel-reporting/common/pm/taskReportingController.class.php
===================================================================
--- branches/papel-reporting/common/pm/taskReportingController.class.php	2010-12-22 12:12:57 UTC (rev 7131)
+++ branches/papel-reporting/common/pm/taskReportingController.class.php	2010-12-22 15:12:34 UTC (rev 7132)
@@ -24,7 +24,7 @@
 	
 	private $orderBy = '';
 	
-	private $asc = 0; 
+	private $asc = 0;
 	
 	private $submitted = 0;
 	
@@ -174,6 +174,7 @@
 	
 	public function getActivityUserPass() {
 		return $this->activityUserPass;
+							
 	}
 	
 	public function setReportDataHeader($reportDataHeader) {
@@ -216,6 +217,176 @@
 		return $this->reportTitles;
 	}
 	
+   /**
+	* groupBy() - groups the results from evolvis and activity in an array
+	* if possible and gives it back. Needed because the activity datebase gets not grouped the way like the evolvis data
+	*
+	* @param stringy $evolvisActivityResult
+	* 
+	* @return array $groupedResult
+	*/
+	public function groupBy($evolvisActivityResult, $groupBy) {
+		
+	}
+	
+   /**
+	* orderBy() - Sorts the results from evolvis and activity in an array
+	* if possible and returns it. Needed because the activity datebase data gets not sorted the way like the evolvis data
+	*
+	* @param array $evolvisActivityResult
+	* @param string $orderBy - the param after that the result has to be sorted
+	* @param int $asc ascending or descending
+	* 
+	* @return array $groupedResult
+	*/
+	public function orderBy($evolvisActivityResult, $orderBy, $asc) {
+		
+	}
+	
+   /**
+	* mergeEvolvisActivityData() - Merges the Evolvis and Activity data and returns it.
+	*
+	* @param string $evolvisResult - the values of the string are separated with #sepRow# and #sepColumn#
+	* @param string $activityResult -  the values of the string are separated with #sepRow# and #sepColumn#
+	* 
+	* @return int $evolvisRowCount
+	*/
+	public function isEvolvisRowCountBiggerThanActivity($evolvisResult, $activityResult) {
+		
+		$evolvisCount = substr_count($evolvisResult, '#sepRow#');
+		
+		$activityCount = substr_count($activityResult, '#sepRow#');
+
+		if($evolvisCount > $activityCount) {
+			$evolvisRowCount = 0;
+		} elseif($evolvisCount < $activityCount) {
+			$evolvisRowCount = 1;
+		} else { //$evolvisCount == $activityCount
+			$evolvisRowCount = 2;
+		}
+
+		return $evolvisRowCount;
+	}
+	
+   /**
+	* mergeEvolvisActivityData() - Merges the Evolvis and Activity data and returns it.
+	*
+	* @param string $evolvisResult - the values of the string are separated with #sepRow# and #sepColumn#
+	* @param string $activityResult -  the values of the string are separated with ascending or descending
+	* 
+	* @return string $mergeResult
+	*/
+	public function mergeEvolvisActivityData($evolvisResult, $activityResult) {
+		
+		/*
+		foreach($evolvisResult as $evolvisHeader) {
+			echo '<br />$evolvisHeader => '.$evolvisHeader;
+		}
+		
+		echo '<br /><br />';
+		
+		foreach($activityResult as $activityHeader) {
+			echo '<br />$activityHeader => '.$activityHeader;
+		}
+
+		$connector = '';
+		if(trim($activityResult[0]) != '') {
+			$connector = '#sepColumn#';
+		}
+			$mergedHeaders = $evolvisResult[0]. $connector . $activityResult[0];
+		
+		echo '<br /><br />$mergedHeaders => '.$mergedHeaders; */
+
+		/* 
+		$evolvisHeader => Länge#sepColumn#Hours done
+			$activityHeader => Hours done
+			
+			$evolvisData => 0#sepColumn#2#sepRow#0#sepColumn#3#sepRow#0#sepColumn#10#sepRow#0#sepColumn#0#sepRow#0#sepColumn#0#sepRow#0#sepColumn#0
+			$activityData => 2#sepRow#3#sepRow#10 
+			
+			//EVOLVIS:
+			0#sepColumn#2	
+						#sepRow#
+			0#sepColumn#3
+						#sepRow#
+			0#sepColumn#10
+						#sepRow#
+			0#sepColumn#0
+						#sepRow#
+			0#sepColumn#0
+						#sepRow#
+			0#sepColumn#0
+			
+			
+			//ACTIVITY:
+			2
+				#sepRow#
+			3	
+				#sepRow#
+			10 	
+		 */	
+		
+		#$mergedResult = array($mergedHeaders, );
+		$mergedResult = '';
+		
+		return $mergedResult;
+	}
+	
+	public function getFormatActivityDataForResult($selectRequest, $projectHours, $groupBy = false) {
+		
+		$onceFlag = false;		
+		foreach($projectHours[0] as $hour) {
+
+			if($selectRequest['hours_done']) { 
+				if($onceFlag == false) {
+					$reportDataHeader_ .= _('Hours done'). '#sepColumn#';
+				}
+				$reportData_ .= $hour . '#sepColumn#';
+			}
+
+			if($selectRequest['hours_done_max']) { 
+				if($onceFlag == false) {
+					$reportDataHeader_ .= _('Maximum hours done'). '#sepColumn#';
+				}
+				$reportData_ .= $hour . '#sepColumn#';
+			}
+		
+			if($selectRequest['hours_done_min']) { 
+				if($onceFlag == false) {
+					$reportDataHeader_ .= _('Minimum hours done'). '#sepColumn#'; 
+				}
+				$reportData_ .= $hour . '#sepColumn#';
+			}
+
+			if($selectRequest['hours_done_avg']) { 
+				if($onceFlag == false) {
+					$reportDataHeader_ .= _('Average hours done'). '#sepColumn#';
+				}
+				$reportData_ .= $hour . '#sepColumn#';
+			}
+					
+			if($selectRequest['hours_done_sum']) { 
+				if($onceFlag == false) {
+					$reportDataHeader_ .= _('Summed hours done'). '#sepColumn#';
+				}
+				$reportData_ .= $hour . '#sepColumn#';						
+			}			
+	
+			$reportData_ = substr($reportData_, 0, strlen($reportData_)-11);
+			$reportData_ .= '#sepRow#';
+			$onceFlag = true;								
+		}
+		
+		$activityDataHeaderAndData = array();			
+		$reportDataHeader_ = substr($reportDataHeader_, 0, strlen($reportDataHeader_)-11);	
+		$reportData_ = substr($reportData_, 0, strlen($reportData_)-8);	
+		
+		$activitydataHeaderAndData[0] = $reportDataHeader_;
+		$activitydataHeaderAndData[1] = $reportData_;
+		
+		return $activitydataHeaderAndData;			
+	}
+	
 	public function getSubmittedCheckedDates() {
 		$whereRequest = $this->getWhereRequest();
 		
@@ -238,7 +409,7 @@
 			$result = true;
 		}
 		
-		return $result; 
+		return $result;
 	}
 	
 	public function getCurrentDateAsArray() {
@@ -339,8 +510,8 @@
 		
 		$selectRequest = $this->getSelectRequest();
 		
-		$evolvisProjectId = $selectRequest['group_id'];
-		#$evolvisProjectId = 69;
+		#$evolvisProjectId = $selectRequest['group_id'];
+		$evolvisProjectId = 69;
   	
     	$objModel = new taskReportingModel();
     	$objModel->setObjReportingInfo($this->getObjReportingInfo());
@@ -366,17 +537,194 @@
 			 		$selectRequest['hours_done_min'] ||
 			 			$selectRequest['hours_done_avg'] ||
 			 				$selectRequest['hours_done_sum']) {
-				$projectInfo = $objModel->getActivityEvolvisProjectInfo($protocolPrefix, $host, $port, $user, $password, $evolvisProjectId);
+			 								
+				//REACTIVATE LATER
+				#$projectInfo = $objModel->getActivityEvolvisProjectInfo($protocolPrefix, $host, $port, $user, $password, $evolvisProjectId);
+				
+				//REMOVE LATER
+				$projectInfo = '[{"id":808,"resource-id":83,"hours":2,"name":"Implementierung","evolvisTaskId":305,"resource-name":"Apel, Patrick","date":"2010-09-09 00:00:00.0","position-id":207,"position-name":"Evolvis Feature Requests"},
+				{"id":809,"resource-id":83,"hours":2,"name":"Implementierung","evolvisTaskId":429,"resource-name":"Apel, Patrick","date":"2010-09-09 00:00:00.0","position-id":207,"position-name":"Evolvis Feature Requests"},
+				{"id":810,"resource-id":83,"hours":2,"name":"Implementierung","evolvisTaskId":430,"resource-name":"Apel, Patrick","date":"2010-09-09 00:00:00.0","position-id":207,"position-name":"Evolvis Feature Requests"},
+				{"id":811,"resource-id":83,"hours":8,"name":"Implementierung","evolvisTaskId":305,"resource-name":"Apel, Patrick","date":"2010-09-09 00:00:00.0","position-id":207,"position-name":"Evolvis Feature Requests"}]';
+		
 			} else {
-				$objModel->testConnectionToActivity($protocolPrefix, $host, $port, $user, $password);
+				//REACIVATE LATER
+				#$objModel->testConnectionToActivity($protocolPrefix, $host, $port, $user, $password);
 			}
-    		
+			
+			/* id: 305 => hours done: 2
+			   id: 429 => hours done: 2
+			   id: 430 => hours done: 2
+			   id: 305 => hours done: 8 */
+			 
+			 /* Id => 305 | Id => 305
+				Id => 428 
+				Id => 429 | Id => 429
+				Id => 430 | Id => 430 
+				Id => 431
+				Id => 436 */
+
     		$objModel->setProjectInfo($projectInfo);
+			$intValue = $objModel->determineNeededSwitchCase($selectRequest);	
+			$intValue = 0; #Remove if necessary
 			
-			$reportData_ = $objModel->getReportData($selectRequest, $whereRequest, $orderBy, $groupBy, $asc); 
-			$reportDataHeader_ = $objModel->getReportDataHeader();	//Has to be after getReportData())	
+			switch($intValue) {
+				case 0: // Evolvis database data and only hours done from the activity database data selected
+				
+					#echo '<br />I am in case 0';
 
+					$groupedActivityData = array();
+					$groupInformation = array(array(array()));
 
+					$evolvisReportData_ = $objModel->getReportData($selectRequest, $whereRequest, $orderBy, $groupBy, $asc, false);
+				
+					$evolvisDataHeader_ = $objModel->getReportDataHeader(); // Needs to be after $reportData_
+					
+					$offcutQuery = $objModel->getOffcutQuery();
+					$params = $objModel->getArrSqlParams();		
+										
+					$arrProjectTaskIds = $objModel->getProjectTaskIdsByString($offcutQuery, $params);
+
+					$projectHours = $objModel->getActivityProjectHours($arrProjectTaskIds, $projectInfo);
+					
+					$evolvisDataHeaderAndData = array($evolvisDataHeader_, $evolvisReportData_);
+
+					$evolvisNonAggData = $objModel->getAllChoosenNonAggData($selectRequest, $whereRequest, $orderBy, $groupBy, $asc);
+					$groupInformation = $objModel->getPossibleGroupInformation($evolvisNonAggData, $projectHours);
+							
+					/*
+					 * $groupInformation[0][0][0] => project task id
+					 * $groupInformation[0][0][1] => hours
+					 */
+	
+					$arrSqlQuerys = array();
+					
+					$i = 0; 
+					foreach($groupInformation as $info) {						
+						$arrSqlQuerys[$i] = $objModel->getReportData2($selectRequest, $whereRequest, $orderBy, $groupBy, $asc, $info);
+						$i++;
+					};
+
+					$arrMergedQuerysAndParams = array(array());
+					$arrMergedQuerysAndParams = $objModel->mergeSqlQuerys($arrSqlQuerys, $selectRequest, $whereRequest, $orderBy, $groupBy, $asc=0, $arrProjectTaskIds);
+					
+					$evolvisReportData_ = $objModel->getReportData3($selectRequest, $whereRequest, $orderBy, $groupBy, $asc, $arrMergedQuerysAndParams, $groupInformation);
+					
+					$reportData_ = $evolvisReportData_;
+					$reportDataHeader_ = $evolvisDataHeader_;
+				break;
+				
+				case 1: // Evolvis database data and only activity aggregation functions selected
+					echo '<br />I am in case 1';
+					
+					$reportData_ = $objModel->getReportData($selectRequest, $whereRequest, $orderBy, $groupBy, $asc, true);
+					$reportDataHeader_ = $objModel->getReportDataHeader();
+					
+					$offcutQuery = $objModel->getOffcutQuery();
+					$params = $objModel->getArrSqlParams();			
+										
+					$arrProjectTaskIds = $objModel->getProjectTaskIdsByString($offcutQuery, $params);
+					$projectHours = $objModel->getActivityProjectHours($arrProjectTaskIds, $projectInfo);
+					
+					$activitydataHeaderAndData = $this->getFormatActivityDataForResult($selectRequest, $projectHours);
+
+					//Needs to get grouped by the values choosen
+				break;
+				
+				case 2: // Evolvis database data and activity hours done and activity aggregation functions selected, so all is selected.
+					echo '<br />I am in case 2';
+					
+					$reportData_ = $objModel->getReportData($selectRequest, $whereRequest, $orderBy, $groupBy, $asc, true);
+					$reportDataHeader_ = $objModel->getReportDataHeader();
+					
+					$offcutQuery = $objModel->getOffcutQuery();
+					$params = $objModel->getArrSqlParams();
+										
+					$arrProjectTaskIds = $objModel->getProjectTaskIdsByString($offcutQuery, $params);
+					$projectHours = $objModel->getActivityProjectHours($arrProjectTaskIds, $projectInfo);
+					
+					//getFormatActivityDataForResult
+					$activitydataHeaderAndData = $this->getFormatActivityDataForResult($selectRequest, $projectHours);
+					
+					//NEEDS TO BE TRIED TO GROUPBY HOURS DONE
+					
+					#$this->isEvolvisRowCountBiggerThanActivity($evolvisReportData_, $activityReportData_);			
+					
+				break;
+				
+				case 3: // Only Evolvis database data
+					echo '<br />I am in case 3';
+					$reportData_ = $objModel->getReportData($selectRequest, $whereRequest, $orderBy, $groupBy, $asc, true);
+					$reportDataHeader_ = $objModel->getReportDataHeader();
+					
+					//Ok. Now we can group by and order the data if someone choosed it.
+				break;
+				case 4: // Only Activity database data and some aggregation fields are selected (Just to feel like SQL for usability reasons)
+					echo '<br />I am in case 4';
+					
+					$objModel->getReportData($selectRequest, $whereRequest, $orderBy, $groupBy, $asc, true); /* The method sets 
+						$objModel->setOffcutQuery() and $objModel->setArrSqlParams() those are needed for the right sortation of the activity database data.
+					**/
+					
+					$offcutQuery = $objModel->getOffcutQuery();
+					$params = $objModel->getArrSqlParams();			
+										
+					$arrProjectTaskIds = $objModel->getProjectTaskIdsByString($offcutQuery, $params);
+					$projectHours = $objModel->getActivityProjectHours($arrProjectTaskIds, $projectInfo);
+
+					$activitydataHeaderAndData = $this->getFormatActivityDataForResult($selectRequest, $projectHours);
+					
+					$reportDataHeader_ = $activitydataHeaderAndData[0];
+					$reportData_ = $activitydataHeaderAndData[1];
+
+				break;
+				case 5: // Only Activity database data and only hours done selected (Just to feel like SQL for usability reasons).
+					echo '<br />I am in case 5';
+					$objModel->getReportData($selectRequest, $whereRequest, $orderBy, $groupBy, $asc, true); /* The method sets 
+						$objModel->setOffcutQuery() and $objModel->setArrSqlParams() those are needed for the right sortation of the activity database data.
+					**/
+					$offcutQuery = $objModel->getOffcutQuery();
+					$params = $objModel->getArrSqlParams();
+										
+					$arrProjectTaskIds = $objModel->getProjectTaskIdsByString($offcutQuery, $params);
+					$projectHours = $objModel->getActivityProjectHours($arrProjectTaskIds, $projectInfo);
+					
+					$activitydataHeaderAndData = $this->getFormatActivityDataForResult($selectRequest, $projectHours);
+					
+					$reportDataHeader_ = $activitydataHeaderAndData[0];
+					$reportData_ = $activitydataHeaderAndData[1];
+						
+				break;
+				case 6: //Only Activity database data selected and only activity aggregation fields selected.
+					echo '<br />I am in case 6';
+					
+					$objModel->getReportData($selectRequest, $whereRequest, $orderBy, $groupBy, $asc, true); /* The method sets 
+						$objModel->setOffcutQuery() and $objModel->setArrSqlParams() those are needed for the right sortation of the activity database data.
+					**/
+					$offcutQuery = $objModel->getOffcutQuery();
+					$params = $objModel->getArrSqlParams();
+										
+					$arrProjectTaskIds = $objModel->getProjectTaskIdsByString($offcutQuery, $params);
+					$projectHours = $objModel->getActivityProjectHours($arrProjectTaskIds, $projectInfo);
+
+					$activitydataHeaderAndData = $this->getFormatActivityDataForResult($selectRequest, $projectHours);
+					
+					$reportDataHeader_ = $activitydataHeaderAndData[0];
+					$reportData_ = $activitydataHeaderAndData[1];
+					
+				break;
+				case 7: // Nothing selected. Finished, but maybe I should include hours done too?
+					echo '<br />I am in case 7';
+					$reportData_ = $objModel->getReportData($selectRequest, $whereRequest, $orderBy, $groupBy, $asc, true);
+					$reportDataHeader_ = $objModel->getReportDataHeader();
+				break;
+					
+				default: //6 Can not happen but anyway
+					$reportData_ = $objModel->getReportData($selectRequest, $whereRequest, $orderBy, $groupBy, $asc, false);
+					$reportDataHeader_ = $objModel->getReportDataHeader();
+				break;
+			}
+			
 			$newArrReportDataHeader = array();
 			$newArrReportData = array();
 			$newArrReportTitle = array();		
@@ -422,7 +770,7 @@
 					|| $oldArrReportData[count($oldArrReportData)-1] == '' && $this->isMergeReports()) {
 
     				if($objModel->isError() === true) {
-
+    					
     					$objView->setError($objModel->isError());
     					$objView->setErrorString($objModel->getErrorString()); 
     					$objView->setRow(false); 
@@ -439,7 +787,8 @@
 			}
 		
 		} else {
-			$objModel->testConnectionToActivity($protocolPrefix, $host, $port, $user, $password);
+			//REACTIVATE LATER
+			#$objModel->testConnectionToActivity($protocolPrefix, $host, $port, $user, $password);
 		}
 		
     	$group_id = $selectRequest['group_id'];

Modified: branches/papel-reporting/common/pm/taskReportingModel.class.php
===================================================================
--- branches/papel-reporting/common/pm/taskReportingModel.class.php	2010-12-22 12:12:57 UTC (rev 7131)
+++ branches/papel-reporting/common/pm/taskReportingModel.class.php	2010-12-22 15:12:34 UTC (rev 7132)
@@ -27,6 +27,10 @@
 	
 	private $strProjectInfo = '';
 	
+	private $strOffcutQuery = '';
+	
+	private $arrSqlParams = array();
+	
 	public function setProjectInfo($projectInfo) {
 		$this->strProjectInfo = $projectInfo;
 	}
@@ -83,7 +87,23 @@
 		return $this->reportDataHeader;
 	}
 	
-	 public function testConnectionToActivity($protocolPrefix='ssl://', $host, $port, $username, $password) {
+	public function setOffcutQuery($strOffcutQuery) {
+		$this->strOffcutQuery = $strOffcutQuery;
+	}
+	
+	public function getOffcutQuery() {
+		return $this->strOffcutQuery;
+	}
+	
+	public function setArrSqlParams($params) {
+		$this->arrSqlParams = $params;
+	}
+	
+	public function getArrSqlParams(){
+		return $this->arrSqlParams;
+	}
+	
+	public function testConnectionToActivity($protocolPrefix='ssl://', $host, $port, $username, $password) {
 		
 		$objReportingInfo = $this->getObjReportingInfo();
 		
@@ -153,24 +173,38 @@
         
 		} else {
 			$objReportingInfo->setConnectionRefusedInfo(_('An error on login on Activity occurred. Hours done not available.'));	
-		}
+		}	
 		
 		return $result;
 	}	
 	
+   /**
+	* getProjectTaskIdsByString() - Returns the project task ids sorted the right way. 
+	* The sorted project task ids are needed to sort the hours done in the right way.
+	*
+	* @param array $offcutSqlQuery - Part of a sql query string excluding the select clause
+	* @param array $params - Params like the value of the attribute GROUP BY or ORDER BY
+	* 
+	* @return array $arrTaskIds;
+	*/
 	public function getProjectTaskIdsByString($offcutSqlQuery, $params) {
 		
 		//SELECT Clause
 		$sqlSelectClause = 'SELECT project_task_id';
 		
 		$offcutSqlQuery_ = $sqlSelectClause . $offcutSqlQuery;
+		$strGroupBy = 'GROUP BY';
 		
+		if(strpos($offcutSqlQuery_, $strGroupBy) != null) {
+			$offcutSqlQuery_ .= ' ,project_task_vw.project_task_id';
+		} 
+
 		$res = db_query_params($offcutSqlQuery_, $params);
 		
 		 if(!$res || db_numrows($res) === 0) {
-		 	
 		 	$error = db_error();
 		 	if(trim($error)!='') {
+
 		 		$this->setError(true);
 		 		$this->setErrorString($error);
 		 	} else {
@@ -182,14 +216,22 @@
 		 } 
 		 
 		 $arrTaskIds = array();
-		 while ($arr = db_fetch_array($res)) {		
+		 while ($arr = db_fetch_array($res)) {	
 		 	array_push($arrTaskIds, $arr[0]);
 		 }
 		 
 		return $arrTaskIds;
 	}
 	
-
+   /**
+	* getActivityProjectHours() - Parses the JASON formated activity data about every evolvis project task related to the project into an array.
+	* The data parsed and saved into an array will later be sorted the way the array $projectTaskIds is.
+	*
+	* @param array $projectTaskIds - The sorted $projectTaskIds
+	* @param string $projectInfo - The whole information about every evolvis task recorded in activity. The data is in the JASON format
+	* 
+	* @return array $arrProjectTaskInfo_;
+	*/
 	public function getActivityProjectHours($projectTaskIds, $projectInfo) {
 		
 		$projectTask = split('},{',$projectInfo);
@@ -230,30 +272,115 @@
 		
 		/* Now we got the evolvis project_task_ids but we need to sort them in the right way like 
 		 * the estimate hours are sorted.
-		 * 
 		 * Do not want to rewrite the loops, so I do it with another loops.
 		 * */
-
+	
 		 $i = 0;
 		 $arrProjectTaskInfo_ = array(array());
 		 foreach($projectTaskIds as $singleProjectTaskId) { 	// 1
-		 														// :
+																// :
 		 	foreach($arrProjectTaskInfo as $projectTaskInfo) { 	// n
 		 		
 		 		if($singleProjectTaskId == $projectTaskInfo[1]) {
 		 			
-		 			$arrProjectTaskInfo_[0][$i] += $projectTaskInfo[0];
-		 			$arrProjectTaskInfo_[1][$i] = $projectTaskInfo[1];
-		 		}
-		 		
+		 			$arrProjectTaskInfo_[0][$i] += $projectTaskInfo[0]; //Hour
+		 			$arrProjectTaskInfo_[1][$i] = $projectTaskInfo[1]; //ID
+		 		}		 		
 		 	}
 		 	$i++;
 		 }
+
+		 $arrProjectTaskInfo__ = array(array());
+		 $i = 0;
+		 foreach($arrProjectTaskInfo_[1] as $id ){
+				$arrProjectTaskInfo__[1][$i] = $id; //ID
+				$i++;
+		 }
+		 
+		 $i = 0;
+		 foreach($arrProjectTaskInfo_[0] as $hours ){
+				$arrProjectTaskInfo__[0][$i] = $hours; //ID
+				$i++;
+		 }
+
+		return $arrProjectTaskInfo__;
+	}
+	
+	public function getMaxActivityHours_($groupInformation) {
+		/* This fields should be sorted the same way.
+		 * $groupInformation[0][0][0] => project task id
+		 * $groupInformation[0][0][1] => hours
+		 */
+		 
+		 #GOT $groupInformation[$o][0][1];
+		 
+		$highestValue = $groupInformation[0][1];  
+		for($i=1; $i<count($groupInformation); $i++) {
+			$tmpValue = $groupInformation[$i][1];
+			
+			if($tmpValue > $highestValue) {
+				$highestValue = $tmpValue;
+			}
+		}
 		
-		return $arrProjectTaskInfo_;
+		return $highestValue;
 	}
 	
-	public function getMaxActivityHours($projectHours) {	
+	public function getMinActivityHours_($groupInformation) {
+		/* This fields should be sorted the same way.
+		 * $groupInformation[0][0][0] => project task id
+		 * $groupInformation[0][0][1] => hours
+		 */
+		 
+		 #GOT $groupInformation[$o][0][1];
+		 
+		$lowestValue = $groupInformation[0][1];  
+		for($i=1; $i<count($groupInformation); $i++) {
+			$tmpValue = $groupInformation[$i][1];
+			
+			if($tmpValue < $lowestValue) {
+				$lowestValue = $tmpValue;
+			}
+		}
+		
+		return $lowestValue;
+	}
+	
+	public function getAvgActivityHours_($groupInformation) {
+		/* This fields should be sorted the same way.
+		 * $groupInformation[0][0][0] => project task id
+		 * $groupInformation[0][0][1] => hours
+		 */
+		 
+		 #GOT $groupInformation[$o][0][1];
+
+		for($i=0; $i<count($groupInformation); $i++) {
+			$tmpValue += $groupInformation[$i][1];
+		}
+		
+		$avgHours = round(($tmpValue / $i) / 2);
+		
+		return $avgHours;
+	}
+	
+	public function getSumActivityHours_($groupInformation) {
+		/* This fields should be sorted the same way.
+		 * $groupInformation[0][0][0] => project task id
+		 * $groupInformation[0][0][1] => hours
+		 */
+		 
+		 #GOT $groupInformation[$o][0][1];
+
+		for($i=0; $i<count($groupInformation); $i++) {
+			$tmpValue += $groupInformation[$i][1];
+		}
+		
+		return $tmpValue;
+	}
+	
+	############################################################
+	
+	public function getMaxActivityHours($projectHours) {
 		return max($projectHours);
 	}
 	
@@ -261,16 +388,463 @@
 		return min($projectHours);
 	}
 	
-	public function getAvgActivityHours($projectHours) {		
-		$avgHours = array_sum($projectHours) / count($projectHours);	
+	public function getAvgActivityHours($projectHours) {
+		$avgHours = array_sum($projectHours) / count($projectHours);
 		return round($avgHours, 2);
 	}
 	
 	public function getSumActivityHours($projectHours) {
 		return array_sum($projectHours);
 	}
+	
+	public function getAllChoosenNonAggData($selectRequest, $whereRequest, $orderBy='', $groupBy='', $asc=0) {
+
+		/* This method will group the fields manually submitted without including aggregation fields. We can only call this method if one normal field is selected. If only aggregation fields are selected */
+		
+		// SELECT CLAUSE
+		$select = 'SELECT project_task_id,'; //It is not grouped so it does not care.
+		
+		$selectAllFlag = true; //false?
+		$countFields = 1;
+		
+		#if($selectRequest['project_task_id']) { $select .= 'project_task_vw.project_task_id,'; $countFields++; $selectAllFlag = false;}
+		if($selectRequest['summary']){ $select .= 'project_task_vw.summary,'; $countFields++; $selectAllFlag = false;}
+		if($selectRequest['details']){ $select .= 'project_task_vw.details,'; $countFields++; $selectAllFlag = false;}
+		if($selectRequest['parent_id']){ $select .= 'project_task_vw.parent_id,'; $countFields++; $selectAllFlag = false;}
+		
+		if($selectRequest['duration']) { $select .= 'project_task_vw.duration,'; $countFields++; $selectAllFlag = false;}
+		if($selectRequest['single_group_project_id']){ $select .= 'project_group_list_vw.group_project_id,'; $countFields++; $selectAllFlag = false;}
+		
+		if($selectRequest['project_name']){ $select .= 'project_group_list_vw.project_name,'; $countFields++; $selectAllFlag = false;}
+		if($selectRequest['description']){ $select .= 'project_group_list_vw.description,'; $countFields++; $selectAllFlag = false;}
+		if($selectRequest['status_id']){ $select .= 'project_task_vw.status_id,'; $countFields++; $selectAllFlag = false;}
+		if($selectRequest['status_name']){ $select .= 'project_task_vw.status_name,'; $countFields++; $selectAllFlag = false;}
+		if($selectRequest['category_id']){ $select .= 'project_task_vw.category_id,'; $countFields++; $selectAllFlag = false;}
+		if($selectRequest['category_name']){ $select .= 'project_task_vw.category_name,'; $countFields++; $selectAllFlag = false;}
+		if($selectRequest['created_by']){ $select .= 'project_task_vw.created_by,'; $countFields++; $selectAllFlag = false;}
+		if($selectRequest['user_name']){ $select .= 'project_task_vw.user_name,'; $countFields++; $selectAllFlag = false;}
+		if($selectRequest['realname']){ $select .= 'project_task_vw.realname,'; $countFields++; $selectAllFlag = false;}
+		if($selectRequest['start_date']){ $select .= 'project_task_vw.start_date,'; $countFields++; $selectAllFlag = false;}
+		
+		if($selectRequest['end_date']){ $select .= 'project_task_vw.end_date,'; $countFields++; $selectAllFlag = false;}
+
+		if($selectRequest['hours']){ $select .= 'project_task_vw.hours,'; $countFields++; $selectAllFlag = false;}
+		
+		/* if($selectRequest['hours_done']){ } Uses in the other cases
+		 */
+
+		if($selectRequest['priority']){ $select .= 'project_task_vw.priority,'; $countFields++; $selectAllFlag = false;}
+
+		if($selectRequest['percent_complete']){ $select .= 'project_task_vw.percent_complete,'; $countFields++; $selectAllFlag = false;}
+		
+		// FROM CLAUSE
+		$from = ' FROM project_task_vw'. ' ' .
+				'INNER JOIN project_group_list_vw'. ' ' .
+				'ON'. ' ' .
+				'project_task_vw.group_project_id = project_group_list_vw.group_project_id'. ' ';	
+	
+		// WHERE CLAUSE		 
+		$where = ' WHERE';
+		
+		$params = array();
+		$countParams = 0;
+		foreach ($whereRequest['group_project_id'] as $group_project_id) {
+			$countParams ++;
+			$where .= ' project_group_list_vw.group_project_id = $' .$countParams. ' OR';
+			array_push($params, $group_project_id);
+		}
+
+		if($countParams > 0) {
+			$i = strlen($where);
+			$where = substr($where, 0, $i-3); //Deletes the last "OR" added from the foreach loop
+		}
+		  
+		$timestampStartDate = mktime(0, 0, 0, $whereRequest['start_date_month'], $whereRequest['start_date_day'], $whereRequest['start_date_year']);
+		$timestampEndDate = mktime(0, 0, 0, $whereRequest['end_date_month'], $whereRequest['end_date_day'], $whereRequest['end_date_year']);
+		
+		if($countParams > 0) { $where.=' AND'; }
+		$countParams++;
+		$where.= ' start_date >= $'.$countParams;
+		array_push($params, $timestampStartDate);
+		
+		$countParams++;
+		$where.= ' AND end_date <= $'.$countParams;
+		array_push($params, $timestampEndDate);
+		
+		$countParams++;
+		$where.= ' AND project_group_list_vw.group_id = $'.$countParams;
+		array_push($params, $selectRequest['group_id']);
+		
+			if($groupBy == '' && $orderBy != '') {
+			if($asc === 0) { 
+				$where.= ' ASC'; 
+			} else { 
+				$where.=' DESC'; 
+			}
+		}
+
+		$sqlQuery = $select . $from . $where;
+		
+		$sqlQuery = preg_replace('/, FROM/', ' FROM', $sqlQuery);
+		
+		$res = db_query_params($sqlQuery, $params);
+
+		if(!$res || db_numrows($res) === 0) {
+		 	
+		 	$error = db_error();
+		 	if(trim($error)!='') {
+		 		$this->setError(true);
+		 		$this->setErrorString($error);
+		 	} else {
+		 		$this->setInfoString(_('No row was found.'));
+		 		$this->setRow(false);
+		 	}
+		 	
+		 	return false;
+		} 
+		 
+		$result = '';
+		$k = 0;
+		$arrResult = array(array());
+		while ($arr = db_fetch_array($res)) {
+
+			if($selectAllFlag) {
+				$countFields = (count($arr) / 2);
+			} 
+			
+			for($j=0; $j<$countFields; $j++) {
+				$arrResult[$k][$j] = $arr[$j];
+			}
+			
+			$k++;
+		}
+
+	/* IMPORTANT:
+	 * gforge=# SELECT hours, COUNT(project_task_id) FROM project_task_vw WHERE project_task_id != 407 GROUP BY hours UNION SELECT hours, COUNT(project_task_id) FROM project_task_vw WHERE project_task_id = 407 GROUP BY hours ORDER BY count;
+     */
+ 
+		return $arrResult;
+	}
+	
+	
+	public function getPossibleGroupInformation($evolvisNonAggData, $projectHours) {
+				
+	/* 
+	 * In here I have to create the SQL Queries
+	 */	
+	 
+	/* 
+	 * There is a 1:n relation between the evolvis data and the activity data.
+	 * It can be that there is no entry in activity for a task, because no one worked on it.
+	 * So it does no care if it will be grouped or not, because the value of hours done is 0 anyway.
+	 */
+				
+	/* IMPORTANT:
+	 * gforge=# SELECT hours, COUNT(project_task_id) FROM project_task_vw WHERE project_task_id != 407 GROUP BY hours UNION SELECT hours, COUNT(project_task_id) FROM project_task_vw WHERE project_task_id = 407 GROUP BY hours ORDER BY count;
+     */
+
+     	$arrIdsToGroupBy = array(array(array()));
+     	$arrIdsToGroupNotBy = array(array(array()));
+			
+		$i = 0;	
+		foreach($evolvisNonAggData as $evolvisData) {
+
+		$dataLoop1 = '';
+		$equalCount = 0;
+		$projectHourId = 0;
+		$projectHour = 0;
+		$idCount = 0;
+		$id_ = '';
+
+			$projectTaskId = $evolvisData[0];
+			
+			foreach($projectHours[1] as $id) {
+				if($projectTaskId == $id) {
+					$id_ = $id;
+						break;
+				}
+				$idCount++;
+			}				
+
+			foreach($evolvisData as $data) {	
+				$dataLoop1 .= $data. ',';					
+			}
+			
+			$dataLoop1_ = split(',',$dataLoop1);
+			$dataLoop1 = '';
+			
+			for($j=1; $j<(count($dataLoop1_)-1); $j++) { $dataLoop1 .= $dataLoop1_[$j].','; }
+
+			$dataLoop1a = $dataLoop1;
+			
+			if($id_ == '') {
+
+				$dataLoop1 = $dataLoop1.'0';			
+			} else {
+				$dataLoop1 = $dataLoop1.$projectHours[0][$idCount];
+			}
+				
+			$k = 0;
+			$l = 0;
+			foreach($evolvisNonAggData as $evolvisData_) {
+			$dataLoop2 = '';
+			$id_ = '';
+			$idCount_ = 0;	
+				
+				$projectTaskId_ = $evolvisData_[0];
+				foreach($evolvisData_ as $data_) {
+					$dataLoop2 .= $data_. ',';
+				}		
+
+				$dataLoop2_ = split(',',$dataLoop2);
+				$dataLoop2 = '';
+				
+				for($j=1; $j<(count($dataLoop2_)-1); $j++) { $dataLoop2 .= $dataLoop2_[$j].','; }
+
+				$dataLoop2a = $dataLoop2;
+				
+				foreach($projectHours[1] as $id) {
+					if($projectTaskId_ == $id) {
+						$id_ = $id;
+							break;
+					}
+					$idCount_++; 
+				}	
+
+				if($id_ == '') {
+					$dataLoop2 = $dataLoop2.'0';			
+				} else {
+					$dataLoop2 = $dataLoop2.$projectHours[0][$idCount_];
+				}
+				
+				if($dataLoop1a == $dataLoop2a) { #&& $id_ != '') {//Without hours done. If $id_ != '' there is an activity entry related to the evolvis entry.
+			
+					if($dataLoop1 == $dataLoop2) { //&& $projectTaskId_ != $projectTaskId; //With hours done. (hours, percent_complete,...,hours done)	
+
+						$arrIdsToGroupBy[$i][$k][0] = $projectTaskId_; //Includes all ids whose choosen fields can be grouped
+						$arrIdsToGroupBy[$i][$k][1] = $projectHours[0][$idCount_];
+						
+						$k++;
+					} 
+				}			
+			}
+			$i++;
+		}
+		
+		$arrIdsToGroupBy2  = $arrIdsToGroupBy;
+		
+		//Need to delete double entries
+		for($i = 0; $i < count($arrIdsToGroupBy); $i++) { //$i => for every of the 46 project task ids //First array
+			
+			for($j = 0; $j < count($arrIdsToGroupBy[$i]); $j++) {
+				
+				$array1 = $arrIdsToGroupBy[$i][$j]; 
+				$count = count($arrIdsToGroupBy[$i][$j]);
+				$sameEntryCount = 0;
+
+				for($k = 0; $k < count($arrIdsToGroupBy2); $k++) { //Second array
+					
+					for($l = 0; $l < count($arrIdsToGroupBy2[$k]); $l++) {
+						
+						$array2 = $arrIdsToGroupBy2[$k][$l]; 
+
+						$array3 = array_diff($array1, $array2);
+
+						if($array3[0] == '') {
+							$sameEntryCount++;			
+						}
+
+						if($sameEntryCount > 1) {
+							$arrIdsToGroupBy2[$k][$l][0] = 0;
+							$arrIdsToGroupBy2[$k][$l][1] = 0; 
+							$sameEntryCount = 1;
+						} 
+					}
+				}	
+			}
+		}
+
+		//Transfer the data in a new array without empty indexes
+		$arrIdsToGroupBy3 = array(array(array()));
+		$k = 0;
+		$l = 0;
+		
+		$flag = false;
+		for($i = 0; $i < count($arrIdsToGroupBy2); $i++) {
+			
+			$flag = false;
+			for($j = 0; $j < count($arrIdsToGroupBy2[$i]); $j++) {
+
+				if($arrIdsToGroupBy2[$i][$j][0] != 0) {
+					
+					$flag = true;
+					
+					$arrIdsToGroupBy3[$k][$l][0] = $arrIdsToGroupBy2[$i][$j][0];
+					$arrIdsToGroupBy3[$k][$l][1] = $arrIdsToGroupBy2[$i][$j][1];
+					$l++;
+					
+				} 
+			}
+			
+			if($flag == true) {
+				$k++;
+			}
+			
+			$l=0;
+		} 
+
+	/* 
+		Id => 305 | Id => 305
+		Id => 428 
+		Id => 429 | Id => 429
+		Id => 430 | Id => 430 
+		Id => 431
+		Id => 436
+	 */
+		return $arrIdsToGroupBy3;
+	}	
+	
+	public function mergeSqlQuerys($arrSqlQuerys) {
+	
+		$query = '';
+		$params = array();
+		for($i = 0; $i < count($arrSqlQuerys); $i++) {
+			$query .= $arrSqlQuerys[$i][0];
+			if((count($arrSqlQuerys)-1) != $i) {
+				$query .= ' UNION ';	
+			}	
+			
+			foreach($arrSqlQuerys[$i][1] as $param) {
+				array_push($params, $param);
+			}		
+		}
+
+		$arrQueryParts = split(' ',$query);
+		$i = 0;
+		
+		foreach($arrQueryParts as $queryParts) {
+			
+			$searchPattern = '\\$+([0-9])';
+
+			if(ereg($searchPattern, $queryParts)) {
+				$i++;
+				$j = (strlen($queryParts))-1;
+			} 
+			
+			$searchPattern_ = '\\$+([0-9]{'.$j.'})';
+			
+			ereg('\\$+([0-9]{'.$j.'})', $queryParts);
+
+			$part = ereg_replace($searchPattern_, '$'.$i.' ', $queryParts);
+			
+			$part_ .= $part .' ';
+		}
+		
+		$mergedSqlQuery = $part_;
+		
+		$arrMergedQuerysAndParams[0] = $mergedSqlQuery;
+		$arrMergedQuerysAndParams[1] = $params;
+		
+		return $arrMergedQuerysAndParams;
+	}
+	
+	public function determineNeededSwitchCase($selectRequest) { //I think this method could be removed
+		
+		$evolvisDbData = false;
+		$activityDbData = false;
+		$hoursDoneSelected = false;
+		$hoursAggSelected = false;
+		
+		if($selectRequest['project_task_id']) { $evolvisDbData = true; }
+		if($selectRequest['project_task_id_max']) { $evolvisDbData = true; }
+		if($selectRequest['project_task_id_min']) { $evolvisDbData = true; }
+		if($selectRequest['project_task_id_count']) { $evolvisDbData = true; }
+		if($selectRequest['summary']){ $evolvisDbData = true; }
+		if($selectRequest['details']){ $evolvisDbData = true; }
+		if($selectRequest['parent_id']){ $evolvisDbData = true; }
+		if($selectRequest['parent_id_max']) { $evolvisDbData = true; }
+		if($selectRequest['parent_id_min']) { $evolvisDbData = true; }	
+		if($selectRequest['parent_id_count']) { $evolvisDbData = true; }
+		if($selectRequest['duration']) { $evolvisDbData = true; }
+		if($selectRequest['duration_max']) { $evolvisDbData = true; }
+		if($selectRequest['duration_min']){ $evolvisDbData = true; }
+		if($selectRequest['duration_avg']){ $evolvisDbData = true; }
+		if($selectRequest['duration_sum']){ $evolvisDbData = true; }
+		if($selectRequest['single_group_project_id']){ $evolvisDbData = true; }
+		if($selectRequest['project_name']){ $evolvisDbData = true; }
+		if($selectRequest['description']){ $evolvisDbData = true; }
+		if($selectRequest['status_id']){ $evolvisDbData = true; }
+		if($selectRequest['status_name']){ $evolvisDbData = true; }
+		if($selectRequest['category_id']){ $evolvisDbData = true; }
+		if($selectRequest['category_name']){ $evolvisDbData = true; }
+		if($selectRequest['created_by']){ $evolvisDbData = true; }
+		if($selectRequest['user_name']){ $evolvisDbData = true; }
+		if($selectRequest['realname']){ $evolvisDbData = true; }
+		if($selectRequest['start_date']){ $evolvisDbData = true; }
+		if($selectRequest['start_date_max']){ $evolvisDbData = true; }
+		if($selectRequest['start_date_min']){ $evolvisDbData = true; }
+		if($selectRequest['start_date_avg']){ $evolvisDbData = true; }
+		if($selectRequest['end_date']){ $evolvisDbData = true; }
+		if($selectRequest['end_date_max']){ $evolvisDbData = true; }
+		if($selectRequest['end_date_min']){ $evolvisDbData = true; }
+		if($selectRequest['end_date_avg']){ $evolvisDbData = true; }
+		if($selectRequest['hours']){ $evolvisDbData = true; }
+		if($selectRequest['hours_max']){ $evolvisDbData = true; }
+		if($selectRequest['hours_min']){ $evolvisDbData = true; }
+		if($selectRequest['hours_avg']){ $evolvisDbData = true; }
+		if($selectRequest['hours_sum']){ $evolvisDbData = true; }
+
+		if($selectRequest['priority']){ $evolvisDbData = true; }
+		if($selectRequest['priority_max']){ $evolvisDbData = true; }
+		if($selectRequest['priority_min']){ $evolvisDbData = true; }
+		if($selectRequest['priority_avg']){ $evolvisDbData = true; }
+		if($selectRequest['percent_complete']){ $evolvisDbData = true; }
+		if($selectRequest['percent_complete_max']){ $evolvisDbData = true; }
+		if($selectRequest['percent_complete_min']){ $evolvisDbData = true; }
+		if($selectRequest['percent_complete_avg']){ $evolvisDbData = true; }
+		if($selectRequest['percent_complete_sum']){ $evolvisDbData = true; }
+			
+		if($selectRequest['hours_done']){ $activityDbData = true; $hoursDoneSelected = true; }
+		if($selectRequest['hours_done_max']){ $activityDbData = true; $hoursAggSelected = true; }
+		if($selectRequest['hours_done_min']){ $activityDbData = true; $hoursAggSelected = true; }
+		if($selectRequest['hours_done_avg']){ $activityDbData = true; $hoursAggSelected = true; }
+		if($selectRequest['hours_done_sum']){ $activityDbData = true; $hoursAggSelected = true; }	
+		
+		if($evolvisDbData == true 
+			&& $activityDbData == true && $hoursAggSelected == false && $hoursDoneSelected == true) {
+			return 0; // Evolvis database data and only hours done from the activity database data selected
+		} elseif($evolvisDbData == true 
+			&& $activityDbData == true && $hoursAggSelected == true && $hoursDoneSelected == false) {
+			return 1; // Evolvis database data and only activity aggregation functions selected
+		} elseif($evolvisDbData == true 
+			&& $activityDbData == true && $hoursAggSelected == true && $hoursDoneSelected == true)	{
+			return 2; // Evolvis database data and hours done and activity aggregation functions selected.
+		} elseif($evolvisDbData == true
+					&& $activityDbData == false) {
+			return 3; // Only Evolvis database data
+		// BEGIN only activity database data
+		} elseif($evolvisDbData == false 
+					&& $activityDbData == true 
+						&& $hoursDoneSelected == true && $hoursAggSelected == true) {
+			return 4; // Only Activity database data and some activity aggregation fields are selected (Just to feel like SQL for usability reasons). 
+		} elseif($evolvisDbData == false 
+					&& $activityDbData == true 
+						&& $hoursDoneSelected == true && $hoursAggSelected == false) {
+			return 5; // Only Activity database data and only hours done selected (Just to feel like SQL for usability reasons).
+		} elseif($evolvisDbData == false 
+					&& $activityDbData == true
+						&& $hoursDoneSelected == false && $hoursAggSelected == true){	
+			return 6; // Only Activity database data selected. Only aggregation fields selected.			
+		// END only activity database data	
+		} elseif($evolvisDbData == false 
+					&& $activityDbData == false) {
+			return 7; // Nothing selected. //finished, but maybe I should include hours done too.
+		} else {
+			return 8; // Can not happen but anyway.
+		}
+	}
     
-    public function getReportData($selectRequest, $whereRequest, $orderBy='', $groupBy='', $asc=0) {
+    public function getReportData($selectRequest, $whereRequest, $orderBy='', $groupBy='', $asc=0, $groupByHoursDone=false) {
 
 		$arrReportHeader = array();
 		
@@ -339,12 +913,6 @@
 		if($selectRequest['hours_avg']){ $select.=' ROUND(AVG(project_task_vw.hours)),'; array_push($arrReportHeader,_('Average hours')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
 		if($selectRequest['hours_sum']){ $select.=' SUM(project_task_vw.hours),'; array_push($arrReportHeader,_('Summed hours')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
 
-		if($selectRequest['hours_done']){ array_push($arrReportHeader,_('Hours done')); $selectAllFlag = false; $countFields++; $doneHoursPos = $countFields;}
-		if($selectRequest['hours_done_max']){ array_push($arrReportHeader,_('Maximum hours done')); $selectAllFlag = false; $countFields++; $maxHoursPos = $countFields;}
-		if($selectRequest['hours_done_min']){ array_push($arrReportHeader,_('Minimum hours done')); $selectAllFlag = false; $countFields++; $minHoursPos = $countFields;}
-		if($selectRequest['hours_done_avg']){ array_push($arrReportHeader,_('Average hours done')); $selectAllFlag = false; $countFields++; $avgHoursPos = $countFields;}
-		if($selectRequest['hours_done_sum']){ array_push($arrReportHeader,_('Summed hours done')); $selectAllFlag = false; $countFields++; $sumHoursPos = $countFields;}
-
 		if($selectRequest['priority']){ $select.=' project_task_vw.priority,'; array_push($arrReportHeader,_('Priority')); array_push($arrGroupBy,'project_task_vw.priority'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
 		if($selectRequest['priority_max']){ $select.=' MAX(project_task_vw.priority),'; array_push($arrReportHeader,_('Maximal priority')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
 		if($selectRequest['priority_min']){ $select.=' MIN(project_task_vw.priority),'; array_push($arrReportHeader,_('Minimal priority')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
@@ -355,11 +923,19 @@
 		if($selectRequest['percent_complete_avg']){ $select.=' ROUND(AVG(project_task_vw.percent_complete)),'; array_push($arrReportHeader,_('Average percent complete')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
 		if($selectRequest['percent_complete_sum']){ $select.=' SUM(project_task_vw.percent_complete),'; array_push($arrReportHeader,_('Summed percent complete')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
 			
+		if($groupByHoursDone == false) {
+			if($selectRequest['hours_done']){ array_push($arrReportHeader,_('Hours done')); $selectAllFlag = false; $countFields++; $doneHoursPos = $countFields;}
+			if($selectRequest['hours_done_max']){ array_push($arrReportHeader,_('Maximum hours done')); $selectAllFlag = false; $countFields++; $maxHoursPos = $countFields;}
+			if($selectRequest['hours_done_min']){ array_push($arrReportHeader,_('Minimum hours done')); $selectAllFlag = false; $countFields++; $minHoursPos = $countFields;}
+			if($selectRequest['hours_done_avg']){ array_push($arrReportHeader,_('Average hours done')); $selectAllFlag = false; $countFields++; $avgHoursPos = $countFields;}
+			if($selectRequest['hours_done_sum']){ array_push($arrReportHeader,_('Summed hours done')); $selectAllFlag = false; $countFields++; $sumHoursPos = $countFields;}
+		}
+
 		if($selectAllFlag == true) { 
 			#$select.= ' *';
 			$select .= ' project_task_vw.project_task_id,
 						project_task_vw.group_project_id,
-						project_task_vw.summary, 
+						project_task_vw.summary,
 						project_task_vw.details,
 						project_task_vw.percent_complete,
 						project_task_vw.priority,
@@ -369,7 +945,7 @@
 						project_task_vw.created_by,
 						project_task_vw.status_id,
 						project_task_vw.category_id,
-						project_task_vw.duration, 
+						project_task_vw.duration,
 						project_task_vw.parent_id,
 						project_task_vw.category_name,
 						project_task_vw.status_name,
@@ -396,7 +972,7 @@
 										_('Created by'),
 										_('Status id'),
 										_('Category id'),
-										_('Duration'),			
+										_('Duration'),
 										_('Parent id'),
 										#_('Maximal duration'),
 										#_('Minimal duration'),
@@ -437,18 +1013,9 @@
 										#_('Summed percent complete'));
 										);
 			$startDateCount = 8;								
-			$endDateCount = 9;								
+			$endDateCount = 9;							
 		}
 		
-		
-		#if(($selectRequest['hours_done'] ||
-		#	$selectRequest['hours_done_max'] ||
-		#	 	$selectRequest['hours_done_min'] ||
-		#	 		$selectRequest['hours_done_avg'] ||
-		#	 			$selectRequest['hours_done_sum']) && count($selectRequest)==(6-1)) { //1 is $selectRequest['group_id']
-		#	$select = 'project_task_id';			
-		#}
-		
 		// FROM CLAUSE
 		$from = ' FROM project_task_vw'. ' ' .
 				'INNER JOIN project_group_list_vw'. ' ' .
@@ -469,7 +1036,7 @@
 		if($countParams > 0) {
 			$i = strlen($where);
 			$where = substr($where, 0, $i-3); //Deletes the last "OR" added from the foreach loop
-		 }
+		}
 		  
 		$timestampStartDate = mktime(0, 0, 0, $whereRequest['start_date_month'], $whereRequest['start_date_day'], $whereRequest['start_date_year']);
 		$timestampEndDate = mktime(0, 0, 0, $whereRequest['end_date_month'], $whereRequest['end_date_day'], $whereRequest['end_date_year']);
@@ -541,7 +1108,7 @@
 				}
 			}
 			
-			if($onlyAggFuncFlag == true && $groupBy == '') {;
+			if($onlyAggFuncFlag == true && $groupBy == '') {
 				$where = substr($where, 0, strlen($where)-8);
 			}
 		}
@@ -583,12 +1150,12 @@
 		
 		$offcutSqlQuery = $from . $where;
 		$offcutSqlQuery_ = preg_replace('/, FROM/', ' FROM',$offcutSqlQuery);
-		
+
 		$sqlQuery = preg_replace('/, FROM/', ' FROM', $sqlQuery);
 		
 		$res = db_query_params($sqlQuery, $params);
 
-		 if(!$res || db_numrows($res) === 0) {
+		if(!$res || db_numrows($res) === 0) {
 		 	
 		 	$error = db_error();
 		 	if(trim($error)!='') {
@@ -600,41 +1167,41 @@
 		 	}
 		 	
 		 	return false;
-		 } 
+		} 
 		 
 		$commaSeparatedReportHeader = implode('#sepColumn#', $arrReportHeader);
 		$this->setReportDataHeader($commaSeparatedReportHeader); 
 		 
 		$this->setInfoString(_('The PDF file is created.')); 
 
-		$arrProjectTaskIds = $this->getProjectTaskIdsByString($offcutSqlQuery_, $params);
-
-		$projectInfo = $this->getProjectInfo();
+		$this->setOffcutQuery($offcutSqlQuery_);
+		$this->setArrSqlParams($params);
 			
-		if($selectRequest['hours_done'] || 
-				$selectRequest['hours_done_max'] ||
-			 		$selectRequest['hours_done_min'] ||
-			 			$selectRequest['hours_done_avg'] ||
-			 				$selectRequest['hours_done_sum']) {
-		 						$projectHours = $this->getActivityProjectHours($arrProjectTaskIds, $projectInfo);
-		} 
+		if($groupByHoursDone == false) {	
+			
+			$arrProjectTaskIds = $this->getProjectTaskIdsByString($offcutSqlQuery_, $params);
+			
+			$projectInfo = $this->getProjectInfo();
+			
+			$projectHours = $this->getActivityProjectHours($arrProjectTaskIds, $projectInfo);
 		 
-		if($selectRequest['hours_done_max']) {
-			$maxHours = $this->getMaxActivityHours($projectHours[0]);
-		}
+			if($selectRequest['hours_done_max']) {
+				$maxHours = $this->getMaxActivityHours($projectHours[0]);
+			}
 		
-		if($selectRequest['hours_done_min']) {
-			$minHours = $this->getMinActivityHours($projectHours[0]);	
-		}
+			if($selectRequest['hours_done_min']) {
+				$minHours = $this->getMinActivityHours($projectHours[0]);
+			}
 		
-		if($selectRequest['hours_done_avg']) {
-			$avgHours = $this->getAvgActivityHours($projectHours[0]);
-		}
+			if($selectRequest['hours_done_avg']) {
+				$avgHours = $this->getAvgActivityHours($projectHours[0]);
+			}
 			
-		if($selectRequest['hours_done_sum']) {
-			$sumHours = $this->getSumActivityHours($projectHours[0]);
+			if($selectRequest['hours_done_sum']) {
+				$sumHours = $this->getSumActivityHours($projectHours[0]);
+			}
 		}
-
+		
 		$result = '';
 		$k = 0;
 		while ($arr = db_fetch_array($res)) {
@@ -657,19 +1224,666 @@
 					$date = 	date(_('Y-m-d H:i'), $arr[$j]);		
 					$result .= $date;
 
-				} elseif($doneHoursPos-1 == $j) {
+				} elseif($doneHoursPos-1 == $j && $groupByHoursDone == false) {
 					
-					$result .= $projectHours[0][$k];
+					$projectHour = $projectHours[0][$k];
+					if($projectHour == null || $projectHour == '') {
+						$projectHour = 0;
+					}
+					$result .= $projectHour;
 	
 					$k++;
+				} elseif($maxHoursPos-1 == $j && $groupByHoursDone == false) {
+					if($maxHours == null || $maxHours == '') {
+						$maxHours = 0;
+					}
+					$result .= $maxHours;
+				} elseif($minHoursPos-1 == $j && $groupByHoursDone == false) {
+					if($minHours == null || $minHours == '') {
+						$minHours = 0;
+					}
+					$result .= $minHours;
+				} elseif($avgHoursPos-1 == $j && $groupByHoursDone == false) {
+					if($avgHours == null || $avgHours == '') {
+						$avgHours = 0;
+					}
+					$result .= $avgHours;
+				} elseif($sumHoursPos-1 == $j && $groupByHoursDone == false) {	
+					if($sumHours == null || $sumHours == '') {
+						$sumHours = 0;
+					}
+					$result .= $sumHours; 
+				} else { 					
+					$result .= $arr[$j];
+				}
+				
+					if($j+1<$countFields) { $result .= '#sepColumn#'; }
+					if($j+1==$countFields) { $result .= '#sepRow#'; }
+			}
+		}
+		
+		$result = substr($result, 0, strlen($result)-8);
+
+		//Only returns the formated data.
+
+		return $result;
+	} 
+
+	public function getReportData2($selectRequest, $whereRequest, $orderBy='', $groupBy='', $asc=0, $arrProjectTaskIds) {
+
+		$arrReportHeader = array();		
+		$arrGroupBy = array();
+		
+		$aggFuncFlag = false;
+		$onlyAggFuncFlag = true;
+		
+		$startDateCount = -1;
+		$startDateCountMax = -1;
+		$startDateCountMin = -1;
+		$startDateCountAvg = -1;
+		
+		$endDateCount = -1;
+		$endDateCountMax = -1;
+		$endDateCountMin = -1;
+		$endDateCountAvg = -1;
+		
+		$doneHoursPos = -1;
+		$maxHoursPos = -1;
+		$minHoursPos = -1;
+		$avgHoursPos = -1;
+		$sumHoursPos = -1;
+		
+		$countFields = 0;
+		//SELECT CLAUSE
+		$selectAllFlag = true;
+		
+		$select ='SELECT ';
+		if($selectRequest['project_task_id']) { $select.=' project_task_vw.project_task_id,'; array_push($arrReportHeader,_('Project task id')); array_push($arrGroupBy,'project_task_vw.project_task_id'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['project_task_id_max']) { $select.=' MAX(project_task_vw.project_task_id),'; array_push($arrReportHeader,_('Maximal project task id')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['project_task_id_min']) { $select.=' MIN(project_task_vw.project_task_id),'; array_push($arrReportHeader,_('Minimal project task id')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['project_task_id_count']) { $select.=' COUNT(project_task_vw.project_task_id),'; array_push($arrReportHeader,_('Project task id count')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['summary']){ $select.=' project_task_vw.summary,';  array_push($arrReportHeader,_('Summary')); array_push($arrGroupBy,'project_task_vw.summary'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['details']){ $select.=' project_task_vw.details,'; array_push($arrReportHeader,_('Details')); array_push($arrGroupBy,'project_task_vw.details'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['parent_id']){ $select.=' project_task_vw.parent_id,'; array_push($arrReportHeader,_('Parent id')); array_push($arrGroupBy,'project_task_vw.parent_id'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['parent_id_max']) { $select.=' MAX(project_task_vw.parent_id),'; array_push($arrReportHeader,_('Maximal parent id')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['parent_id_min']) { $select.=' MIN(project_task_vw.parent_id),'; array_push($arrReportHeader,_('Minimal parent id')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }	
+		if($selectRequest['parent_id_count']) { $select.=' COUNT(project_task_vw.parent_id),'; array_push($arrReportHeader,_('Parent id count')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['duration']) { $select.=' project_task_vw.duration,'; array_push($arrReportHeader,_('Duration')); array_push($arrGroupBy,'duration'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['duration_max']) { $select.=' MAX(project_task_vw.duration),'; array_push($arrReportHeader,_('Maximal duration')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['duration_min']){ $select.=' MIN(project_task_vw.duration),'; array_push($arrReportHeader,_('Minimal duration')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['duration_avg']){ $select.=' ROUND(AVG(project_task_vw.duration)),'; array_push($arrReportHeader,_('Average duration')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['duration_sum']){ $select.=' SUM(project_task_vw.duration),'; array_push($arrReportHeader,_('Summed duration')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['single_group_project_id']){ $select.=' project_group_list_vw.group_project_id,'; array_push($arrReportHeader,_('Group project id')); array_push($arrGroupBy,'project_group_list_vw.group_project_id'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['project_name']){ $select.=' project_group_list_vw.project_name,'; array_push($arrReportHeader,_('Project name')); array_push($arrGroupBy,'project_group_list_vw.project_name'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['description']){ $select.=' project_group_list_vw.description,'; array_push($arrReportHeader,_('Description')); array_push($arrGroupBy,'project_group_list_vw.description'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['status_id']){ $select.=' project_task_vw.status_id,'; array_push($arrReportHeader,_('Status id')); array_push($arrGroupBy,'project_task_vw.status_id'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['status_name']){ $select.=' project_task_vw.status_name,'; array_push($arrReportHeader,_('Status name')); array_push($arrGroupBy,'project_task_vw.status_name'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['category_id']){ $select.=' project_task_vw.category_id,'; array_push($arrReportHeader,_('Category id')); array_push($arrGroupBy,'project_task_vw.category_id'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['category_name']){ $select.=' project_task_vw.category_name,'; array_push($arrReportHeader,_('Category name')); array_push($arrGroupBy,'project_task_vw.category_name'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['created_by']){ $select.=' project_task_vw.created_by,'; array_push($arrReportHeader,_('Created by')); array_push($arrGroupBy,'project_task_vw.created_by'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['user_name']){ $select.=' project_task_vw.user_name,'; array_push($arrReportHeader,_('Username')); array_push($arrGroupBy,'project_task_vw.user_name'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['realname']){ $select.=' project_task_vw.realname,'; array_push($arrReportHeader,_('Real name')); array_push($arrGroupBy,'project_task_vw.realname'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['start_date']){ $select.=' project_task_vw.start_date,'; array_push($arrReportHeader,_('Start date')); array_push($arrGroupBy,'project_task_vw.start_date'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; $startDateCount=$countFields; }
+		if($selectRequest['start_date_max']){ $select.=' MAX(project_task_vw.start_date),'; array_push($arrReportHeader,_('Maximal start date'));  $selectAllFlag = false; $aggFuncFlag = true; $countFields++; $startDateCountMax=$countFields; }
+		if($selectRequest['start_date_min']){ $select.=' MIN(project_task_vw.start_date),'; array_push($arrReportHeader,_('Minimal start date')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; $startDateCountMin=$countFields; }
+		if($selectRequest['start_date_avg']){ $select.=' ROUND(AVG(project_task_vw.start_date)),'; array_push($arrReportHeader,_('Average start date')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; $startDateCountAvg=$countFields; }
+		if($selectRequest['end_date']){ $select.=' project_task_vw.end_date,'; array_push($arrReportHeader,_('End date')); array_push($arrGroupBy,'project_task_vw.end_date'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; $endDateCount=$countFields; }
+		if($selectRequest['end_date_max']){ $select.=' MAX(project_task_vw.end_date),'; array_push($arrReportHeader,_('Maximal end date')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; $endDateCountMax=$countFields; }
+		if($selectRequest['end_date_min']){ $select.=' MIN(project_task_vw.end_date),'; array_push($arrReportHeader,_('Minimal end date')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; $endDateCountMin=$countFields;}
+		if($selectRequest['end_date_avg']){ $select.=' ROUND(AVG(project_task_vw.end_date)),'; array_push($arrReportHeader,_('Average end date')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; $endDateCountAvg=$countFields;}
+		if($selectRequest['hours']){ $select.=' project_task_vw.hours,'; array_push($arrReportHeader,_('Hours')); array_push($arrGroupBy,'project_task_vw.hours'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['hours_max']){ $select.=' MAX(project_task_vw.hours),'; array_push($arrReportHeader,_('Maximal hours')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['hours_min']){ $select.=' MIN(project_task_vw.hours),'; array_push($arrReportHeader,_('Minimal hours')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['hours_avg']){ $select.=' ROUND(AVG(project_task_vw.hours)),'; array_push($arrReportHeader,_('Average hours')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['hours_sum']){ $select.=' SUM(project_task_vw.hours),'; array_push($arrReportHeader,_('Summed hours')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+
+		if($selectRequest['priority']){ $select.=' project_task_vw.priority,'; array_push($arrReportHeader,_('Priority')); array_push($arrGroupBy,'project_task_vw.priority'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['priority_max']){ $select.=' MAX(project_task_vw.priority),'; array_push($arrReportHeader,_('Maximal priority')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['priority_min']){ $select.=' MIN(project_task_vw.priority),'; array_push($arrReportHeader,_('Minimal priority')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['priority_avg']){ $select.=' ROUND(AVG(project_task_vw.priority)),'; array_push($arrReportHeader,_('Average priority')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['percent_complete']){ $select.=' project_task_vw.percent_complete,'; array_push($arrReportHeader,_('Percent complete')); array_push($arrGroupBy,'project_task_vw.percent_complete'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['percent_complete_max']){ $select.=' MAX(project_task_vw.percent_complete),'; array_push($arrReportHeader,_('Maximal percent complete')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['percent_complete_min']){ $select.=' MIN(project_task_vw.percent_complete),'; array_push($arrReportHeader,_('Minimal percent complete')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['percent_complete_avg']){ $select.=' ROUND(AVG(project_task_vw.percent_complete)),'; array_push($arrReportHeader,_('Average percent complete')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['percent_complete_sum']){ $select.=' SUM(project_task_vw.percent_complete),'; array_push($arrReportHeader,_('Summed percent complete')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+
+
+		if($selectAllFlag == true) { 
+			#$select.= ' *';
+			$select .= ' project_task_vw.project_task_id,
+						project_task_vw.group_project_id,
+						project_task_vw.summary, 
+						project_task_vw.details,
+						project_task_vw.percent_complete,
+						project_task_vw.priority,
+						project_task_vw.hours,
+						project_task_vw.start_date,
+						project_task_vw.end_date,
+						project_task_vw.created_by,
+						project_task_vw.status_id,
+						project_task_vw.category_id,
+						project_task_vw.duration, 
+						project_task_vw.parent_id,
+						project_task_vw.category_name,
+						project_task_vw.status_name,
+						project_task_vw.user_name,
+						project_task_vw.realname,
+						project_group_list_vw.project_name,
+						project_group_list_vw.description';
+			$arrReportHeader = array(_('Project task id'),
+										_('Group project id'),
+										#_('Maximal project task id'),
+										#_('Minimal project task id'),
+										#_('Project task id count'),
+										_('Summary'),
+										_('Details'),
+										#_('Parent id'),
+										#_('Maximal parent id'),
+										#_('Minimal parent id'),
+										#_('Parent id count'),
+										_('Percent complete'),
+										_('Priority'),
+										_('Hours'),
+										_('Start date'),
+										_('End date'),
+										_('Created by'),
+										_('Status id'),
+										_('Category id'),
+										_('Duration'),			
+										_('Parent id'),
+										#_('Maximal duration'),
+										#_('Minimal duration'),
+										#_('Average duration'),
+										#_('Summed duration'),
+										#_('Last modified date'),
+										_('Category name'),
+										_('Status name'),										
+										_('Username'), 
+										_('Real name'),		
+										#_('Group project id'),
+										#_('Group id'),
+										_('Project name'),
+										#_('Is plubic'),
+										_('Description')
+										#_('Maximal start date'),
+										#_('Minimal start date'),
+										#_('Average start date'),
+										#_('End date'),
+										#_('Maximal end date'),
+										#_('Minimal end date'),
+										#_('Average end date'),
+										#_('Maximal hours'),
+										#_('Minimal hours'),
+										#_('Average hours'),
+										#_('Summed hours'),
+										#_('Hours done'),
+										#_('Maximal hours done'),
+										#_('Minimal hours done'),
+										#_('Average hours done'),
+										#_('Summed hours done'),
+										#_('Maximal priority'),
+										#_('Minimal priority'),
+										#_('Average priority'),										
+										#_('Maximal percent complete'),
+										#_('Minimal percent complete'),
+										#_('Average percent complete'));
+										#_('Summed percent complete'));
+										);
+			$startDateCount = 8;								
+			$endDateCount = 9;								
+		}
+		
+		// FROM CLAUSE
+		$from = ' FROM project_task_vw'. ' ' .
+				'INNER JOIN project_group_list_vw'. ' ' .
+				'ON'. ' ' .
+				'project_task_vw.group_project_id = project_group_list_vw.group_project_id'. ' ';
+				 
+		// WHERE CLAUSE		 
+		$where = ' WHERE';
+		
+		$params = array();
+		$countParams = 0;
+		foreach ($whereRequest['group_project_id'] as $group_project_id) {
+			$countParams ++;
+			$where .= ' project_group_list_vw.group_project_id = $' .$countParams. ' OR';
+			array_push($params, $group_project_id);
+		}
+
+		if($countParams > 0) {
+			$i = strlen($where);
+			$where = substr($where, 0, $i-3); //Deletes the last "OR" added from the foreach loop
+		}
+		  
+		$timestampStartDate = mktime(0, 0, 0, $whereRequest['start_date_month'], $whereRequest['start_date_day'], $whereRequest['start_date_year']);
+		$timestampEndDate = mktime(0, 0, 0, $whereRequest['end_date_month'], $whereRequest['end_date_day'], $whereRequest['end_date_year']);
+		
+		if($countParams > 0) { $where.=' AND'; }
+		$countParams++;
+		$where.= ' start_date >= $'.$countParams;
+		array_push($params, $timestampStartDate);
+		
+		$countParams++;
+		$where.= ' AND end_date <= $'.$countParams;
+		array_push($params, $timestampEndDate);
+		
+		$countParams++;
+		$where.= ' AND project_group_list_vw.group_id = $'.$countParams;
+		array_push($params, $selectRequest['group_id']);
+		
+		foreach($arrProjectTaskIds as $ids) {
+			$countParams ++;
+			$where .= ' OR project_task_id = $'.$countParams;
+			array_push($params, $ids[0]);
+		}
+
+		$tblPrefix = '';
+		if($groupBy != '' && get_magic_quotes_gpc() == true 
+			|| $aggFuncFlag == true && get_magic_quotes_gpc() == true) { 
+			switch($groupBy) {
+				case 'single_group_project_id': $tblPrefix = 'project_group_list_vw.';
+				break;
+				case 'project_name': $tblPrefix = 'project_group_list_vw.';
+				break;
+				case 'description': $tblPrefix = 'project_group_list_vw.';
+				default: $tblPrefix = 'project_task_vw.';
+				break;
+			}
+			/* $countParams++;
+			$where.=' GROUP BY $'.$countParams;
+			array_push($params, $prefix.$groupBy);
+			
+			It does not work with placeholders and array params.
+			So I used the security function enabled through the method
+			db_query_params() in here. */
+			if($groupBy === 'single_group_project_id') {
+				$groupBy = 'group_project_id';
+			}
+			
+			$where.= ' GROUP BY ';
+			$groupBy__ = '';
+			$groupAvailable = false;
+			foreach($arrGroupBy as $groupBy_) {
+				if($groupBy == $groupBy_) {
+					$groupAvailable = true;
+				}
+				$groupBy__.=' '.$groupBy_.',';
+			}
+
+			$where.= $groupBy__;
+			if($groupBy == '') {
+				$where = substr($where, 0, strlen($where)-1);
+			}
+			
+			if(!$groupAvailable) {
+				if($groupBy != '') {
+					$where.=$tblPrefix.$groupBy;
+				}
+			} else {
+				if(!$onlyAggFuncFlag) {
+					$where = substr($where, 0, strlen($where)-1);
+				} else {
+					$where = substr($where, 0, strlen($where)-8);
+				}
+				
+				if($groupBy != '' && !$onlyAggFuncFlag) {	
+					$where.=', '.$tblPrefix.$groupBy;
+				}
+			}
+			
+			if($onlyAggFuncFlag == true && $groupBy == '') {
+				$where = substr($where, 0, strlen($where)-8);
+			}
+		}
+		
+		$tblPrefix = '';
+		if($orderBy != '' && get_magic_quotes_gpc() == true) { 
+			switch($orderBy) {
+				case 'single_group_project_id': $tblPrefix = 'project_group_list_vw.';
+				break;
+				case 'project_name': $tblPrefix = 'project_group_list_vw.';
+				break;
+				case 'description': $tblPrefix = 'project_group_list_vw.';
+				default: $tblPrefix = 'project_task_vw.';
+				break;
+			}
+			/* $countParams++;
+			$where.= ' ORDER BY $'.$countParams; 
+			array_push($params, $orderBy);
+			
+			It does not work with placeholders and array params.
+			So I used the security function enabled through the method
+			db_query_params() in here. */
+			if($orderBy === 'single_group_project_id') {
+				$orderBy = 'group_project_id';
+			}
+			
+			$where.= ' ORDER BY '.$tblPrefix.$orderBy; 
+		}
+			
+		if($groupBy == '' && $orderBy != '') {
+			if($asc === 0) { 
+				$where.= ' ASC'; 
+			} else { 
+				$where.=' DESC';
+			}
+		}
+
+		$sqlQuery = $select . $from . $where;
+		
+		$offcutSqlQuery = $from . $where;
+		$offcutSqlQuery_ = preg_replace('/, FROM/', ' FROM',$offcutSqlQuery);
+
+		$sqlQuery = preg_replace('/, FROM/', ' FROM', $sqlQuery);
+		
+		$arrSqlQueryInfo = array(array());
+		$arrSqlQueryInfo[0] = $sqlQuery;
+		$arrSqlQueryInfo[1] = $params;	
+		
+		return $arrSqlQueryInfo;
+	} 
+	
+	public function getReportData3($selectRequest, $whereRequest, $orderBy='', $groupBy='', $asc=0, $arrMergedQuerysAndParams, $groupInformation) {
+
+		/* $selectRequest needed to know the order of the data, so I can convert the timestamp in a date.
+		 * $whereRequest needed to group and order the merged Query again, so that the whole output will be merged. 
+		 * Otherwise every string will ordered and grouped his own way. Group By and order by has to be at the last of the merged Queries.
+		 * $groupInformation includes the hours done to put into an aggregation function.
+		 * */
+
+		$arrReportHeader = array();
+		
+		$arrGroupBy = array();
+		
+		$aggFuncFlag = false;
+		$onlyAggFuncFlag = true;
+		
+		$startDateCount = -1;
+		$startDateCountMax = -1;
+		$startDateCountMin = -1;
+		$startDateCountAvg = -1;
+		
+		$endDateCount = -1;
+		$endDateCountMax = -1;
+		$endDateCountMin = -1;
+		$endDateCountAvg = -1;
+		
+		$doneHoursPos = -1;
+		$maxHoursPos = -1;
+		$minHoursPos = -1;
+		$avgHoursPos = -1;
+		$sumHoursPos = -1;
+		
+		$countFields = 0;
+		$projectTaskIdChoosen = false;
+		//SELECT CLAUSE IS NOT NEEDED, BECAUSE WE HAVE A SQL QUERY ALREADY
+
+		if($selectRequest['project_task_id']) { array_push($arrReportHeader,_('Project task id')); array_push($arrGroupBy,'project_task_vw.project_task_id'); $selectAllFlag = false; $onlyAggFuncFlag = false; $projectTaskIdChoosen = true; $countFields++; }
+		if($selectRequest['project_task_id_max']) { array_push($arrReportHeader,_('Maximal project task id')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['project_task_id_min']) { array_push($arrReportHeader,_('Minimal project task id')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['project_task_id_count']) { $select.=' COUNT(project_task_vw.project_task_id),'; array_push($arrReportHeader,_('Project task id count')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['summary']){ array_push($arrReportHeader,_('Summary')); array_push($arrGroupBy,'project_task_vw.summary'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['details']){ array_push($arrReportHeader,_('Details')); array_push($arrGroupBy,'project_task_vw.details'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['parent_id']){ array_push($arrReportHeader,_('Parent id')); array_push($arrGroupBy,'project_task_vw.parent_id'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['parent_id_max']) { array_push($arrReportHeader,_('Maximal parent id')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['parent_id_min']) { array_push($arrReportHeader,_('Minimal parent id')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }	
+		if($selectRequest['parent_id_count']) { array_push($arrReportHeader,_('Parent id count')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['duration']) { array_push($arrReportHeader,_('Duration')); array_push($arrGroupBy,'duration'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['duration_max']) { array_push($arrReportHeader,_('Maximal duration')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['duration_min']){ array_push($arrReportHeader,_('Minimal duration')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['duration_avg']){ array_push($arrReportHeader,_('Average duration')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['duration_sum']){ array_push($arrReportHeader,_('Summed duration')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['single_group_project_id']){ array_push($arrReportHeader,_('Group project id')); array_push($arrGroupBy,'project_group_list_vw.group_project_id'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['project_name']){ array_push($arrReportHeader,_('Project name')); array_push($arrGroupBy,'project_group_list_vw.project_name'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['description']){ array_push($arrReportHeader,_('Description')); array_push($arrGroupBy,'project_group_list_vw.description'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['status_id']){ array_push($arrReportHeader,_('Status id')); array_push($arrGroupBy,'project_task_vw.status_id'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['status_name']){ array_push($arrReportHeader,_('Status name')); array_push($arrGroupBy,'project_task_vw.status_name'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['category_id']){ array_push($arrReportHeader,_('Category id')); array_push($arrGroupBy,'project_task_vw.category_id'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['category_name']){ array_push($arrReportHeader,_('Category name')); array_push($arrGroupBy,'project_task_vw.category_name'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['created_by']){ array_push($arrReportHeader,_('Created by')); array_push($arrGroupBy,'project_task_vw.created_by'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['user_name']){ array_push($arrReportHeader,_('Username')); array_push($arrGroupBy,'project_task_vw.user_name'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['realname']){ array_push($arrReportHeader,_('Real name')); array_push($arrGroupBy,'project_task_vw.realname'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['start_date']){ array_push($arrReportHeader,_('Start date')); array_push($arrGroupBy,'project_task_vw.start_date'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; $startDateCount=$countFields; }
+		if($selectRequest['start_date_max']){ array_push($arrReportHeader,_('Maximal start date'));  $selectAllFlag = false; $aggFuncFlag = true; $countFields++; $startDateCountMax=$countFields; }
+		if($selectRequest['start_date_min']){ array_push($arrReportHeader,_('Minimal start date')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; $startDateCountMin=$countFields; }
+		if($selectRequest['start_date_avg']){ array_push($arrReportHeader,_('Average start date')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; $startDateCountAvg=$countFields; }
+		if($selectRequest['end_date']){ array_push($arrReportHeader,_('End date')); array_push($arrGroupBy,'project_task_vw.end_date'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; $endDateCount=$countFields; }
+		if($selectRequest['end_date_max']){ array_push($arrReportHeader,_('Maximal end date')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; $endDateCountMax=$countFields; }
+		if($selectRequest['end_date_min']){ array_push($arrReportHeader,_('Minimal end date')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; $endDateCountMin=$countFields;}
+		if($selectRequest['end_date_avg']){ array_push($arrReportHeader,_('Average end date')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; $endDateCountAvg=$countFields;}
+		if($selectRequest['hours']){ array_push($arrReportHeader,_('Hours')); array_push($arrGroupBy,'project_task_vw.hours'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['hours_max']){ array_push($arrReportHeader,_('Maximal hours')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['hours_min']){ array_push($arrReportHeader,_('Minimal hours')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['hours_avg']){ array_push($arrReportHeader,_('Average hours')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['hours_sum']){ array_push($arrReportHeader,_('Summed hours')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+
+		if($selectRequest['priority']){ array_push($arrReportHeader,_('Priority')); array_push($arrGroupBy,'project_task_vw.priority'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['priority_max']){ array_push($arrReportHeader,_('Maximal priority')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['priority_min']){ array_push($arrReportHeader,_('Minimal priority')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['priority_avg']){ array_push($arrReportHeader,_('Average priority')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['percent_complete']){ array_push($arrReportHeader,_('Percent complete')); array_push($arrGroupBy,'project_task_vw.percent_complete'); $selectAllFlag = false; $onlyAggFuncFlag = false; $countFields++; }
+		if($selectRequest['percent_complete_max']){ array_push($arrReportHeader,_('Maximal percent complete')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['percent_complete_min']){ array_push($arrReportHeader,_('Minimal percent complete')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['percent_complete_avg']){ array_push($arrReportHeader,_('Average percent complete')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+		if($selectRequest['percent_complete_sum']){ array_push($arrReportHeader,_('Summed percent complete')); $selectAllFlag = false; $aggFuncFlag = true; $countFields++; }
+			
+		if($selectRequest['hours_done']){ array_push($arrReportHeader,_('Hours done')); $selectAllFlag = false; $countFields++; $doneHoursPos = $countFields;}
+		if($selectRequest['hours_done_max']){ array_push($arrReportHeader,_('Maximum hours done')); $selectAllFlag = false; $countFields++; $maxHoursPos = $countFields;}
+		if($selectRequest['hours_done_min']){ array_push($arrReportHeader,_('Minimum hours done')); $selectAllFlag = false; $countFields++; $minHoursPos = $countFields;}
+		if($selectRequest['hours_done_avg']){ array_push($arrReportHeader,_('Average hours done')); $selectAllFlag = false; $countFields++; $avgHoursPos = $countFields;}
+		if($selectRequest['hours_done_sum']){ array_push($arrReportHeader,_('Summed hours done')); $selectAllFlag = false; $countFields++; $sumHoursPos = $countFields;}
+		
+		// FROM CLAUSE IST NOT NEEDED ANYMORE
+				 
+		// WHERE CLAUSE IST NOT NEEDED ANYMORE		 
+		$where = '';
+
+		$tblPrefix = '';
+		if($groupBy != '' && get_magic_quotes_gpc() == true 
+			|| $aggFuncFlag == true && get_magic_quotes_gpc() == true) { 
+			switch($groupBy) {
+				case 'single_group_project_id': $tblPrefix = 'project_group_list_vw.';
+				break;
+				case 'project_name': $tblPrefix = 'project_group_list_vw.';
+				break;
+				case 'description': $tblPrefix = 'project_group_list_vw.';
+				default: $tblPrefix = 'project_task_vw.';
+				break;
+			}
+			/* $countParams++;
+			$where.=' GROUP BY $'.$countParams;
+			array_push($params, $prefix.$groupBy);
+			
+			It does not work with placeholders and array params.
+			So I used the security function enabled through the method
+			db_query_params() in here. */
+			if($groupBy === 'single_group_project_id') {
+				$groupBy = 'group_project_id';
+			}
+			
+			$where.= ' GROUP BY ';
+			$groupBy__ = '';
+			$groupAvailable = false;
+			foreach($arrGroupBy as $groupBy_) {
+				if($groupBy == $groupBy_) {
+					$groupAvailable = true;
+				}
+				$groupBy__.=' '.$groupBy_.',';
+			}
+
+			$where.= $groupBy__;
+			if($groupBy == '') {
+				$where = substr($where, 0, strlen($where)-1);
+			}
+			
+			if(!$groupAvailable) {
+				if($groupBy != '') {
+					$where.=$tblPrefix.$groupBy;
+				}
+			} else {
+				if(!$onlyAggFuncFlag) {
+					$where = substr($where, 0, strlen($where)-1);
+				} else {
+					$where = substr($where, 0, strlen($where)-8);
+				}
+				
+				if($groupBy != '' && !$onlyAggFuncFlag) {	
+					$where.=', '.$tblPrefix.$groupBy;
+				}
+			}
+			
+			if($onlyAggFuncFlag == true && $groupBy == '') {
+				$where = substr($where, 0, strlen($where)-8);
+			}
+		}
+		
+		$tblPrefix = '';
+		if($orderBy != '' && get_magic_quotes_gpc() == true) { 
+			switch($orderBy) {
+				case 'single_group_project_id': $tblPrefix = 'project_group_list_vw.';
+				break;
+				case 'project_name': $tblPrefix = 'project_group_list_vw.';
+				break;
+				case 'description': $tblPrefix = 'project_group_list_vw.';
+				default: $tblPrefix = 'project_task_vw.';
+				break;
+			}
+			/* $countParams++;
+			$where.= ' ORDER BY $'.$countParams; 
+			array_push($params, $orderBy);
+			
+			It does not work with placeholders and array params.
+			So I used the security function enabled through the method
+			db_query_params() in here. */
+			if($orderBy === 'single_group_project_id') {
+				$orderBy = 'group_project_id';
+			}
+			
+			$where.= ' ORDER BY '.$tblPrefix.$orderBy; 
+		}
+			
+		if($groupBy == '' && $orderBy != '') {
+			if($asc === 0) { 
+				$where.= ' ASC'; 
+			} else { 
+				$where.=' DESC'; 
+			}
+		}
+
+		$res = db_query_params($arrMergedQuerysAndParams[0], $arrMergedQuerysAndParams[1]);
+
+		if(!$res || db_numrows($res) === 0) {
+		 	
+		 	$error = db_error();
+		 	if(trim($error)!='') {
+		 		$this->setError(true);
+		 		$this->setErrorString($error);
+		 	} else {
+		 		$this->setInfoString(_('No row was found.'));
+		 		$this->setRow(false);
+		 	}
+		 	
+		 	return false;
+		}
+		
+		$result = '';
+		$k = 0;
+		$o = 0;
+		$hours = 0;
+		while ($arr = db_fetch_array($res)) {
+			
+			if($selectAllFlag) {
+				$countFields = (count($arr) / 2);
+			} 
+			
+			for($j=0; $j<$countFields; $j++) {	
+				
+				foreach($groupInformation as $groupInformationParts) {
+					foreach($groupInformationParts as $infoParts) {
+						if($infoParts[0] == $arr[0]) {
+							$hours = $infoParts[1];
+						}
+					}
+				}		
+				
+				if($startDateCount-1 == $j
+						|| $startDateCountMax-1 == $j
+							|| $startDateCountMin-1 == $j 
+								|| $startDateCountAvg-1 == $j
+									|| $endDateCount-1 == $j
+										|| $endDateCountMax-1 == $j
+											|| $endDateCountMin-1 == $j
+												|| $endDateCountAvg-1 == $j) {	
+					$date = 	date(_('Y-m-d H:i'), $arr[$j]);		
+					$result .= $date;
+
+				} elseif($doneHoursPos-1 == $j) { 
+
+					if($projectTaskIdChoosen == true) {
+						
+						$projectHour = $hours;
+					} else {
+						$projectHour = ($groupInformation[$o][0][1]);
+					}
+					
+					if($projectHour == null || $projectHour == '') {
+						$projectHour = 0;
+					}
+					$result .= $projectHour;
+	
+					$k++;
 				} elseif($maxHoursPos-1 == $j) {
+					
+					if($projectTaskIdChoosen == true) {
+						$maxHours = $hours;
+					} else {
+						$maxHours = $this->getMaxActivityHours_($groupInformation[$o]);
+					}
+					
+					if($maxHours == null || $maxHours == '') {
+						$maxHours = 0;
+					}
 					$result .= $maxHours;
+					
 				} elseif($minHoursPos-1 == $j) {
+					
+					if($projectTaskIdChoosen == true) {
+						$minHours = $hours;
+					} else {
+						$minHours = $this->getMinActivityHours_($groupInformation[$o]);
+					}
+					
+					if($minHours == null || $minHours == '') {
+						$minHours = 0;
+					}
 					$result .= $minHours;
+					
 				} elseif($avgHoursPos-1 == $j) {
+					
+					if($projectTaskIdChoosen == true) {
+						$avgHours = $hours;	
+					} else {
+						$avgHours = $this->getAvgActivityHours_($groupInformation[$o]);
+					}
+					
+					if($avgHours == null || $avgHours == '') {
+						$avgHours = 0;
+					}
 					$result .= $avgHours;
+					
 				} elseif($sumHoursPos-1 == $j) {	
+					
+					if($projectTaskIdChoosen == true) {
+						$sumHours = $hours;
+					} else {
+						$sumHours = $this->getSumActivityHours_($groupInformation[$o]);
+					}
+					
+					if($sumHours == null || $sumHours == '') {
+						$sumHours = 0;
+					}
 					$result .= $sumHours; 
+					
 				} else { 					
 					$result .= $arr[$j];
 				}
@@ -677,11 +1891,14 @@
 					if($j+1<$countFields) { $result .= '#sepColumn#'; }
 					if($j+1==$countFields) { $result .= '#sepRow#'; }
 			}
-
+			
+			if($projectTaskIdChoosen == false) {
+				$o++;
+			}
 		}
 		
 		$result = substr($result, 0, strlen($result)-8);
-			
+		
 		return $result;
 	} 
 
@@ -706,7 +1923,7 @@
 		 	$arr_[$i]['group_project_id'] = $arr[0];
 		 	$arr_[$i]['project_name'] = $arr[1];
 
-		 $i++;
+		 	$i++;
 		 }
 		 
 		 return $arr_;



More information about the evolvis-commits mailing list