home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 April / CMCD0404.ISO / Software / Freeware / Programare / dotproject / modules / projects / reports / allocateduserhours.php < prev    next >
Encoding:
PHP Script  |  2004-01-15  |  8.8 KB  |  240 lines

  1. <?php
  2.  
  3. $do_report             = dPgetParam( $_POST, "do_report", 0 );
  4. $log_start_date     = dPgetParam( $_POST, "log_start_date", 0 );
  5. $log_end_date         = dPgetParam( $_POST, "log_end_date", 0 );
  6. $log_all_projects     = dPgetParam($_POST["log_all_projects"], 0);
  7. $log_all            = dPgetParam($_POST["log_all"], 0);
  8.  
  9. // create Date objects from the datetime fields
  10. $start_date = intval( $log_start_date ) ? new CDate( $log_start_date ) : new CDate();
  11. $end_date   = intval( $log_end_date )   ? new CDate( $log_end_date ) : new CDate();
  12.  
  13. if (!$log_start_date) {
  14.     $start_date->subtractSpan( new Date_Span( "14,0,0,0" ) );
  15. }
  16. $end_date->setTime( 23, 59, 59 );
  17. ?>
  18.  
  19. <script language="javascript">
  20. var calendarField = '';
  21.  
  22. function popCalendar( field ){
  23.     calendarField = field;
  24.     idate = eval( 'document.editFrm.log_' + field + '.value' );
  25.     window.open( 'index.php?m=public&a=calendar&dialog=1&callback=setCalendar&date=' + idate, 'calwin', 'top=250,left=250,width=250, height=220, scollbars=false' );
  26. }
  27.  
  28. /**
  29.  *    @param string Input date in the format YYYYMMDD
  30.  *    @param string Formatted date
  31.  */
  32. function setCalendar( idate, fdate ) {
  33.     fld_date = eval( 'document.editFrm.log_' + calendarField );
  34.     fld_fdate = eval( 'document.editFrm.' + calendarField );
  35.     fld_date.value = idate;
  36.     fld_fdate.value = fdate;
  37. }
  38. </script>
  39.  
  40. <form name="editFrm" action="index.php?m=projects&a=reports" method="post">
  41. <input type="hidden" name="project_id" value="<?php echo $project_id;?>" />
  42. <input type="hidden" name="report_type" value="<?php echo $report_type;?>" />
  43.  
  44. <table cellspacing="0" cellpadding="4" border="0" width="100%" class="std">
  45.  
  46.  
  47. <tr>
  48.     <td align="right" nowrap="nowrap"><?php echo $AppUI->_('For period');?>:</td>
  49.     <td nowrap="nowrap">
  50.         <input type="hidden" name="log_start_date" value="<?php echo $start_date->format( FMT_TIMESTAMP_DATE );?>" />
  51.         <input type="text" name="start_date" value="<?php echo $start_date->format( $df );?>" class="text" disabled="disabled" />
  52.         <a href="#" onClick="popCalendar('start_date')">
  53.             <img src="./images/calendar.gif" width="24" height="12" alt="<?php echo $AppUI->_('Calendar');?>" border="0" />
  54.         </a>
  55.     </td>
  56.     <td align="right" nowrap="nowrap"><?php echo $AppUI->_('to');?></td>
  57.     <td nowrap="nowrap">
  58.         <input type="hidden" name="log_end_date" value="<?php echo $end_date ? $end_date->format( FMT_TIMESTAMP_DATE ) : '';?>" />
  59.         <input type="text" name="end_date" value="<?php echo $end_date ? $end_date->format( $df ) : '';?>" class="text" disabled="disabled" />
  60.         <a href="#" onClick="popCalendar('end_date')">
  61.             <img src="./images/calendar.gif" width="24" height="12" alt="<?php echo $AppUI->_('Calendar');?>" border="0" />
  62.         </a>
  63.     </td>
  64.  
  65.     <td nowrap="nowrap">
  66.         <input type="checkbox" name="log_all_projects" <?php if ($log_all_projects) echo "checked" ?> />
  67.         <?php echo $AppUI->_( 'Log All Projects' );?>
  68.     </td>
  69.     
  70.     <td align="right" width="50%" nowrap="nowrap">
  71.         <input class="button" type="submit" name="do_report" value="<?php echo $AppUI->_('submit');?>" />
  72.     </td>
  73. </tr>
  74.  
  75. </table>
  76. </form>
  77.  
  78. <?php
  79. if($do_report){
  80.     
  81.     // Let's figure out which users we have
  82.     $sql = "SELECT  u.user_id,
  83.                      u.user_username, 
  84.                     u.user_first_name, 
  85.                     u.user_last_name
  86.             FROM users AS u";
  87.     
  88.     $user_list = db_loadHashList($sql, "user_id");
  89.     
  90.     $sql = "SELECT t.*
  91.             FROM tasks AS t
  92.             WHERE (task_start_date
  93.                BETWEEN \"".$start_date->format( FMT_DATETIME_MYSQL )."\" 
  94.                     AND \"".$end_date->format( FMT_DATETIME_MYSQL )."\" 
  95.                OR task_end_date    BETWEEN \"".$start_date->format( FMT_DATETIME_MYSQL )."\" 
  96.                     AND \"".$end_date->format( FMT_DATETIME_MYSQL )."\")
  97.             AND !isnull(task_end_date) AND task_end_date != '0000-00-00 00:00:00'
  98.             AND !isnull(task_start_date) AND task_start_date != '0000-00-00 00:00:00'
  99.             AND task_dynamic   ='0'
  100.             AND task_milestone = '0'
  101.             AND task_duration  > 0";
  102.  
  103.     if(!$log_all_projects){
  104.         $sql .= " AND t.task_project='$project_id'\n";
  105.     }
  106.  
  107.     $task_list_hash = db_loadHashList($sql, "task_id");
  108.     $task_list      = array();
  109.     foreach($task_list_hash as $task_id => $task_data){
  110.         $task = new CTask();
  111.         $task->bind($task_data);
  112.         $task_list[] = $task;
  113.     }
  114.     
  115.     $user_usage            = array();
  116.     $task_dates            = array();
  117.     
  118.     $actual_date = $start_date;
  119.     $days_header = ""; // we will save days title here
  120.     
  121.     if ( count($task_list) == 0 ) {
  122.         echo "<p>" . $AppUI->_( 'No data available' ) ."</p>";
  123.     }else {
  124.         foreach($task_list as $task) {
  125.             $task_start_date  = new CDate($task->task_start_date);
  126.             $task_end_date    = new CDate($task->task_end_date);
  127.             
  128.             $day_difference   = $task_end_date->dateDiff($task_start_date);
  129.             $actual_date      = $task_start_date;
  130.     
  131.             $users                 = $task->getAssignedUsers();
  132.             $task_duration_per_day = $task->getTaskDurationPerDay();
  133.             
  134.             for($i = 0; $i<=$day_difference; $i++){
  135.                 if(!$actual_date->before($start_date) && !$actual_date->after($end_date)
  136.                    && $actual_date->isWorkingDay()){
  137.     
  138.                     foreach($users as $user_id => $user_data){
  139.                         if(!isset($user_usage[$user_id][$actual_date->format("%Y%m%d")])){
  140.                             $user_usage[$user_id][$actual_date->format("%Y%m%d")] = 0;
  141.                         }
  142.                         $user_usage[$user_id][$actual_date->format("%Y%m%d")] += $task_duration_per_day;
  143.                         if($user_usage[$user_id][$actual_date->format("%Y%m%d")] < 0.005){
  144.                             //We want to show at least 0.01 even when the assigned time is very small so we know
  145.                             //that at that time the user has a running task
  146.                             $user_usage[$user_id][$actual_date->format("%Y%m%d")] += 0.006;
  147.                         }
  148.                     }
  149.                 }
  150.                 $actual_date->addDays(1);
  151.             }
  152.         }
  153.     
  154.         $days_difference = $end_date->dateDiff($start_date);
  155.         $actual_date     = $start_date;
  156.         $working_days_count = 0;
  157.         $allocated_hours_sum = 0;
  158.         
  159.         $table_header = "<tr><th>".$AppUI->_("User")."</th>";
  160.         for($i=0; $i<=$days_difference; $i++){
  161.             $table_header .= "<th>".utf8_encode(Date_Calc::getWeekdayAbbrname($actual_date->day, $actual_date->month, $actual_date->year, 3))."</th>";
  162.             if($actual_date->isWorkingDay()){
  163.                 $working_days_count++;
  164.             }
  165.             $actual_date->addDays(1);
  166.         }
  167.         $table_header .= "<th nowrap='nowrap'>".$AppUI->_("Allocated")."</th></tr>";
  168.         
  169.         $table_rows = "";
  170.         
  171.         foreach($user_list as $user_id => $user_data){
  172.             if(isset($user_usage[$user_id])) {
  173.                 $table_rows .= "<tr><td nowrap='nowrap'>(".$user_data["user_username"].") ".$user_data["user_first_name"]." ".$user_data["user_last_name"]."</td>";
  174.                 $actual_date = $start_date;
  175.                 for($i=0; $i<=$days_difference; $i++){
  176.                     $table_rows .= "<td>";
  177.                     if(isset($user_usage[$user_id][$actual_date->format("%Y%m%d")])){
  178.                         $hours       = number_format($user_usage[$user_id][$actual_date->format("%Y%m%d")],2);
  179.                         $table_rows .= $hours;
  180.                         $percentage_used = round($hours/$AppUI->getConfig("daily_working_hours")*100);
  181.                         $bar_color       = "blue";
  182.                         if($percentage_used > 100){
  183.                             $bar_color = "red";
  184.                             $percentage_used = 100;
  185.                         }
  186.                         $table_rows .= "<div style='height:2px;width:$percentage_used%; background-color:$bar_color'> </div>";
  187.                     } else {
  188.                         $table_rows .= " ";
  189.                     } 
  190.                     $table_rows .= "</td>";
  191.                     $actual_date->addDays(1);
  192.                 }
  193.                 
  194.                 $array_sum = array_sum($user_usage[$user_id]);
  195.                 $average_user_usage = number_format( ($array_sum/($working_days_count*$AppUI->getConfig("daily_working_hours")))*100, 2);
  196.                 $allocated_hours_sum += $array_sum;
  197.                 
  198.                 $bar_color = "blue";
  199.                 if($average_user_usage > 100){
  200.                     $bar_color = "red";
  201.                     $average_user_usage = 100;
  202.                 }
  203.                 $table_rows .= "<td ><div align='right'>". $average_user_usage ;
  204.                 $table_rows .= "%</div>";
  205.                 $table_rows .= "<div align='left' style='height:2px;width:$average_user_usage%; background-color:$bar_color'> </div></td>";
  206.                 $table_rows .= "</tr>";
  207.                 
  208.             }
  209.         }
  210.         ?>
  211.             <center><table class="std">
  212.             <?php echo $table_header . $table_rows; ?>
  213.             </table>
  214.             <table width="100%"><tr><td align="center">
  215.         <?php
  216.             $total_hours_capacity = $working_days_count*$AppUI->getConfig("daily_working_hours")*count($user_usage);
  217.     
  218.             echo $AppUI->_("<h4>Total capacity for shown users</h4>");
  219.             echo $AppUI->_("Allocated hours").": ".number_format($allocated_hours_sum,2)."<br />";
  220.             echo $AppUI->_("Total capacity").": ".number_format($total_hours_capacity,2)."<br />";
  221.             echo $AppUI->_("Percentage used").": ".number_format($allocated_hours_sum/$total_hours_capacity,2)*100 ."%<br />";
  222.     ?>
  223.             </td>
  224.             <td align="center">
  225.         <?php
  226.             $total_hours_capacity = $working_days_count*$AppUI->getConfig("daily_working_hours")*count($user_list);
  227.     
  228.             echo $AppUI->_("<h4>Total capacity for all users</h4>");
  229.             echo $AppUI->_("Allocated hours").": ".number_format($allocated_hours_sum,2)."<br />";
  230.             echo $AppUI->_("Total capacity").": ".number_format($total_hours_capacity,2)."<br />";
  231.             echo $AppUI->_("Percentage used").": ".number_format($allocated_hours_sum/$total_hours_capacity,2)*100 ."%<br />";
  232.     }            
  233. }
  234.             ?>        
  235.             </td></tr>
  236.             </table>
  237.             </center>
  238.  
  239.  
  240.