/** * Print the project costs * * @param $project Project object * @param $withtemplate boolean Template or basic item (default '') * * @return Nothing (call to classes members) **/ static function showForProject(Project $project, $withtemplate = '') { global $DB, $CFG_GLPI; $ID = $project->fields['id']; if (!$project->getFromDB($ID) || !$project->can($ID, READ)) { return false; } $canedit = $project->can($ID, UPDATE); echo "<div class='center'>"; $query = "SELECT *\n FROM `glpi_projectcosts`\n WHERE `projects_id` = '{$ID}'\n ORDER BY `begin_date`"; $rand = mt_rand(); if ($canedit) { echo "<div id='viewcost" . $ID . "_{$rand}'></div>\n"; echo "<script type='text/javascript' >\n"; echo "function viewAddCost" . $ID . "_{$rand}() {\n"; $params = array('type' => __CLASS__, 'parenttype' => 'Project', 'projects_id' => $ID, 'id' => -1); Ajax::updateItemJsCode("viewcost" . $ID . "_{$rand}", $CFG_GLPI["root_doc"] . "/ajax/viewsubitem.php", $params); echo "};"; echo "</script>\n"; echo "<div class='center firstbloc'>" . "<a class='vsubmit' href='javascript:viewAddCost" . $ID . "_{$rand}();'>"; echo __('Add a new cost') . "</a></div>\n"; } $total = 0; if ($result = $DB->query($query)) { echo "<table class='tab_cadre_fixehov'>"; echo "<tr class='noHover'><th colspan='5'>" . self::getTypeName($DB->numrows($result)) . "</th></tr>"; if ($DB->numrows($result)) { echo "<tr><th>" . __('Name') . "</th>"; echo "<th>" . __('Begin date') . "</th>"; echo "<th>" . __('End date') . "</th>"; echo "<th>" . __('Budget') . "</th>"; echo "<th>" . __('Cost') . "</th>"; echo "</tr>"; Session::initNavigateListItems(__CLASS__, sprintf(__('%1$s = %2$s'), Project::getTypeName(1), $project->getName())); while ($data = $DB->fetch_assoc($result)) { echo "<tr class='tab_bg_2' " . ($canedit ? "style='cursor:pointer' onClick=\"viewEditCost" . $data['projects_id'] . "_" . $data['id'] . "_{$rand}();\"" : '') . ">"; $name = empty($data['name']) ? sprintf(__('%1$s (%2$s)'), $data['name'], $data['id']) : $data['name']; echo "<td>"; printf(__('%1$s %2$s'), $name, Html::showToolTip($data['comment'], array('display' => false))); if ($canedit) { echo "\n<script type='text/javascript' >\n"; echo "function viewEditCost" . $data['projects_id'] . "_" . $data["id"] . "_{$rand}() {\n"; $params = array('type' => __CLASS__, 'parenttype' => 'Project', 'projects_id' => $data["projects_id"], 'id' => $data["id"]); Ajax::updateItemJsCode("viewcost" . $ID . "_{$rand}", $CFG_GLPI["root_doc"] . "/ajax/viewsubitem.php", $params); echo "};"; echo "</script>\n"; } echo "</td>"; echo "<td>" . Html::convDate($data['begin_date']) . "</td>"; echo "<td>" . Html::convDate($data['end_date']) . "</td>"; echo "<td>" . Dropdown::getDropdownName('glpi_budgets', $data['budgets_id']) . "</td>"; echo "<td class='numeric'>" . Html::formatNumber($data['cost']) . "</td>"; $total += $data['cost']; echo "</tr>"; Session::addToNavigateListItems(__CLASS__, $data['id']); } echo "<tr class='b noHover'><td colspan='3'> </td>"; echo "<td class='right'>" . __('Total cost') . '</td>'; echo "<td class='numeric'>" . Html::formatNumber($total) . '</td></tr>'; } else { echo "<tr><th colspan='5'>" . __('No item found') . "</th></tr>"; } echo "</table>"; } echo "</div>"; echo "<div>"; $ticketcost = TicketCost::showForObject($project); echo "</div>"; echo "<div class='b'>"; printf(__('%1$s: %2$s'), __('Total cost'), $total + $ticketcost); echo "</div>"; }
/** * Is the current user have right to edit the current task ? * * @return boolean **/ function canUpdateItem() { if (!Session::haveAccessToEntity($this->getEntityID())) { return false; } $project = new Project(); if ($project->getFromDB($this->fields['projects_id'])) { return Session::haveRight(self::$rightname, UPDATE) || Session::haveRight('projecttask', ProjectTask::UPDATEMY) && ($this->fields["users_id"] === Session::getLoginUserID() || $this->isInTheTeam()); } return false; }
/** show GANTT diagram for a project or for all * * @param $ID ID of the project or -1 for all projects */ static function showGantt($ID) { global $DB; if ($ID > 0) { $project = new Project(); if ($project->getFromDB($ID) && $project->canView()) { $todisplay = static::getDataToDisplayOnGantt($ID); } else { return false; } } else { $todisplay = array(); // Get all root projects $query = "SELECT *\n FROM `glpi_projects`\n WHERE `projects_id` = '0'\n AND `show_on_global_gantt` = '1'\n " . getEntitiesRestrictRequest("AND", 'glpi_projects', "", '', true); foreach ($DB->request($query) as $data) { $todisplay += static::getDataToDisplayOnGantt($data['id'], false); } ksort($todisplay); } $data = array(); $invalid = array(); if (count($todisplay)) { // Prepare for display foreach ($todisplay as $key => $val) { if (!empty($val['from']) && !empty($val['to'])) { $temp = array(); $color = 'ganttRed'; if ($val['percent'] > 50) { $color = 'ganttOrange'; } if ($val['percent'] == 100) { $color = 'ganttGreen'; } switch ($val['type']) { case 'project': $temp = array('name' => $val['link'], 'desc' => '', 'values' => array(array('from' => "/Date(" . strtotime($val['from']) . "000)/", 'to' => "/Date(" . strtotime($val['to']) . "000)/", 'desc' => $val['desc'], 'label' => $val['percent'] . "%", 'customClass' => $color))); break; case 'task': if (isset($val['is_milestone']) && $val['is_milestone']) { $color = 'ganttMilestone'; } $temp = array('name' => ' ', 'desc' => str_repeat('-', $val['parents']) . $val['link'], 'values' => array(array('from' => "/Date(" . strtotime($val['from']) . "000)/", 'to' => "/Date(" . strtotime($val['to']) . "000)/", 'desc' => $val['desc'], 'label' => strlen($val['percent'] == 0) ? '' : $val['percent'] . "%", 'customClass' => $color))); break; } $data[] = $temp; } else { $invalid[] = $val['link']; } } // Html::printCleanArray($data); } if (count($invalid)) { echo sprintf(__('Invalid items (no start or end date): %s'), implode(',', $invalid)); echo "<br><br>"; } if (count($data)) { $months = array(__('January'), __('February'), __('March'), __('April'), __('May'), __('June'), __('July'), __('August'), __('September'), __('October'), __('November'), __('December')); $dow = array(Toolbox::substr(__('Sunday'), 0, 1), Toolbox::substr(__('Monday'), 0, 1), Toolbox::substr(__('Tuesday'), 0, 1), Toolbox::substr(__('Wednesday'), 0, 1), Toolbox::substr(__('Thursday'), 0, 1), Toolbox::substr(__('Friday'), 0, 1), Toolbox::substr(__('Saturday'), 0, 1)); echo "<div class='gantt'></div>"; $js = "\n \$('.gantt').gantt({\n source: " . json_encode($data) . ",\n navigate: 'scroll',\n maxScale: 'months',\n itemsPerPage: 20,\n months: " . json_encode($months) . ",\n dow: " . json_encode($dow) . ",\n onItemClick: function(data) {\n // alert('Item clicked - show some details');\n },\n onAddClick: function(dt, rowId) {\n // alert('Empty space clicked - add an item!');\n },\n });"; echo Html::scriptBlock($js); } else { _e('No item to display'); } }