mirror of
https://github.com/salesagility/SuiteCRM.git
synced 2024-12-22 12:28:31 +00:00
771 lines
34 KiB
PHP
Executable File
771 lines
34 KiB
PHP
Executable File
<?php
|
|
/**
|
|
*
|
|
* SugarCRM Community Edition is a customer relationship management program developed by
|
|
* SugarCRM, Inc. Copyright (C) 2004-2013 SugarCRM Inc.
|
|
*
|
|
* SuiteCRM is an extension to SugarCRM Community Edition developed by SalesAgility Ltd.
|
|
* Copyright (C) 2011 - 2018 SalesAgility Ltd.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it under
|
|
* the terms of the GNU Affero General Public License version 3 as published by the
|
|
* Free Software Foundation with the addition of the following permission added
|
|
* to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
|
|
* IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
|
|
* OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License along with
|
|
* this program; if not, see http://www.gnu.org/licenses or write to the Free
|
|
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
* 02110-1301 USA.
|
|
*
|
|
* You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
|
|
* SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
|
|
*
|
|
* The interactive user interfaces in modified source and object code versions
|
|
* of this program must display Appropriate Legal Notices, as required under
|
|
* Section 5 of the GNU Affero General Public License version 3.
|
|
*
|
|
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
|
|
* these Appropriate Legal Notices must retain the display of the "Powered by
|
|
* SugarCRM" logo and "Supercharged by SuiteCRM" logo. If the display of the logos is not
|
|
* reasonably feasible for technical reasons, the Appropriate Legal Notices must
|
|
* display the words "Powered by SugarCRM" and "Supercharged by SuiteCRM".
|
|
*/
|
|
|
|
if (!defined('sugarEntry') || !sugarEntry) {
|
|
die('Not A Valid Entry Point');
|
|
}
|
|
|
|
#[\AllowDynamicProperties]
|
|
class chart
|
|
{
|
|
private $start_date;
|
|
private $end_date;
|
|
private $tasks;
|
|
private $projects;
|
|
private $users;
|
|
private $contacts;
|
|
private $chart_type;
|
|
|
|
public function __construct($start_date, $end_date, $projects, $users, $contacts, $tasks, $chart_type)
|
|
{
|
|
$this->start_date = $start_date;
|
|
$this->end_date = $end_date;
|
|
$this->tasks = $tasks;
|
|
$this->projects = $projects;
|
|
$this->users = $users;
|
|
$this->contacts = $contacts;
|
|
$this->chart_type = $chart_type;
|
|
|
|
//draw the grid
|
|
$this->draw($this->start_date, $this->end_date, $this->projects, $this->users, $this->contacts, $this->tasks, $this->chart_type);
|
|
}
|
|
|
|
public function draw($start_date, $end_date, $sel_projects, $sel_users, $sel_contacts, $resources, $chart_type)
|
|
{
|
|
global $current_user, $mod_strings;
|
|
$db = DBManagerFactory::getInstance();
|
|
|
|
if ($chart_type == "monthly") {
|
|
list($time_span, $day_count) = $this->year_week($start_date, $end_date);
|
|
} elseif ($chart_type == "quarterly") {
|
|
list($time_span, $day_count) = $this->year_quarter($start_date, $end_date);
|
|
} else {
|
|
$time_span = $this->year_month($start_date, $end_date);
|
|
$day_count = $this->count_days($start_date, $end_date) + 1;
|
|
}
|
|
|
|
|
|
|
|
$weeks = $this->get_weeks($start_date, $end_date);
|
|
|
|
|
|
//Get projects. This is for the Select box values
|
|
$projects_query = "SELECT DISTINCT id, name FROM project WHERE deleted =0";
|
|
$projects_list = $db->query($projects_query);
|
|
|
|
$project_list = array();
|
|
while ($row = $db->fetchByAssoc($projects_list)) {
|
|
//create array of user objects
|
|
$project_list[] = (object)$row;
|
|
}
|
|
|
|
//Get users that are associated to any project. This is for the Select box values
|
|
$users_query = "SELECT DISTINCT project_users_1users_idb AS id, first_name, last_name, 'project_users_1_c' AS
|
|
type
|
|
FROM project_users_1_c
|
|
JOIN users ON users.id = project_users_1users_idb
|
|
WHERE project_users_1_c.deleted =0";
|
|
$users_list = $db->query($users_query);
|
|
|
|
$user_list = array();
|
|
while ($row = $db->fetchByAssoc($users_list)) {
|
|
//create array of user objects
|
|
$user_list[] = (object)$row;
|
|
}
|
|
|
|
//Get contacts that are associated to any project. This is for the Select box values
|
|
$contacts_query = "SELECT DISTINCT project_contacts_1contacts_idb AS id, first_name, last_name, 'project_contacts_1_c' AS
|
|
type
|
|
FROM project_contacts_1_c
|
|
JOIN contacts ON contacts.id = project_contacts_1contacts_idb
|
|
WHERE project_contacts_1_c.deleted =0";
|
|
$contacts_list = $db->query($contacts_query);
|
|
|
|
|
|
|
|
$contact_list = array();
|
|
while ($row = $db->fetchByAssoc($contacts_list)) {
|
|
//create array of user objects
|
|
$contact_list[] = (object)$row;
|
|
}
|
|
|
|
//Generate main table and the first row containing the months
|
|
|
|
echo '<div class="moduleTitle"><h2> ' . $mod_strings["LBL_RESOURCE_CHART"] . ' </h2></div>
|
|
<table id="header_table_chart" border="0" cellpadding="0" cellspacing="0" width="100%">
|
|
<tr>
|
|
<td scope="row_label" nowrap="nowrap" >
|
|
<label for="projects">'.$mod_strings["LBL_PROJECTS_SEARCH"].'</label>
|
|
</td>
|
|
<td scope="row_val" nowrap="nowrap" >
|
|
<select id="projects" name="projects" multiple size="6" style="width: 250px" >
|
|
<option value="">'.$mod_strings["LBL_ALL_PROJECTS"].'</option>';
|
|
|
|
//From the query above, populates the select box
|
|
foreach ($project_list as $project) {
|
|
if (in_array($project->id, $sel_projects)) {//Check if the select box option matches the resource passed in.
|
|
$selected = "selected='selected'"; //if so set it to selected
|
|
} else {
|
|
$selected = "";
|
|
}
|
|
|
|
echo '<option '.$selected.' value="'.$project->id.'">'.$project->name.'</option>';
|
|
}
|
|
|
|
echo '</select><br /><br />';
|
|
|
|
if (empty($project_list)) {
|
|
echo '<span style="color: red;">'.$mod_strings['LBL_RESOURCE_CHART_WARNING'].'</span><br /><br />';
|
|
}
|
|
|
|
echo '</td>
|
|
<td scope="row_label" nowrap="nowrap" >
|
|
<label for="users">'.$mod_strings["LBL_USERS_SEARCH"].'</label>
|
|
</td>
|
|
<td scope="row_val" nowrap="nowrap" >
|
|
<select id="users" name="users" multiple size="6" style="width: 250px" >
|
|
<option ' . ($sel_users[0] == ''? "selected='selected'" : "") . ' value="">'.$mod_strings['LBL_ALL_USERS'].'</option>
|
|
<option ' . ($sel_users[0] == 'none'? "selected='selected'" : "") . ' value="none">None</option>';
|
|
|
|
//From the query above, populates the select box
|
|
foreach ($user_list as $user) {
|
|
$user_obj = BeanFactory::newBean('Users');
|
|
$user_obj->retrieve($user->id);
|
|
var_dump($user_obj->id);
|
|
if (in_array($user->id, $sel_users)) {//Check if the select box option matches the resource passed in.
|
|
$selected = "selected='selected'"; //if so set it to selected
|
|
} else {
|
|
$selected = "";
|
|
}
|
|
echo '<option '.$selected.' data-type="'.$user->type.'" value="'.$user->id.'">'. $user_obj->full_name .'</option>'; //$user->last_name
|
|
}
|
|
|
|
echo '</select><br /><br />';
|
|
|
|
if (empty($user_list)) {
|
|
echo '<span style="color: red;">'.$mod_strings['LBL_RESOURCE_CHART_WARNING'].'</span><br /><br />';
|
|
}
|
|
|
|
echo '</td>
|
|
<td scope="row_label" nowrap="nowrap" >
|
|
<label for="contacts">'.$mod_strings["LBL_CONTACTS_SEARCH"].'</label>
|
|
</td>
|
|
<td scope="row_val" nowrap="nowrap" >
|
|
<select id="contacts" name="contacts" multiple size="6" style="width: 250px" >
|
|
<option ' . ($sel_contacts[0] == ''? "selected='selected'" : "") . ' value="">'.$mod_strings['LBL_ALL_CONTACTS'].'</option>
|
|
<option ' . ($sel_contacts[0] == 'none'? "selected='selected'" : "") . ' value="none">None</option>';
|
|
|
|
//From the query above, populates the select box
|
|
foreach ($contact_list as $contact) {
|
|
$contact_obj = BeanFactory::newBean('Contacts');
|
|
$contact_obj->retrieve($contact->id);
|
|
|
|
if (in_array($contact->id, $sel_contacts)) {//Check if the select box option matches the resource passed in.
|
|
$selected = "selected='selected'"; //if so set it to selected
|
|
} else {
|
|
$selected = "";
|
|
}
|
|
|
|
echo '<option '.$selected.' data-type="'.$contact->type.'" value="'.$contact->id.'">'.$contact_obj->full_name.'</option>';
|
|
}
|
|
|
|
echo '</select><br /><br />';
|
|
|
|
if (empty($contact_list)) {
|
|
echo '<span style="color: red;">'.$mod_strings['LBL_RESOURCE_CHART_WARNING'].'</span><br /><br />';
|
|
}
|
|
|
|
|
|
echo '</td></tr>';
|
|
echo '<tr>
|
|
<td scope="row_label" nowrap="nowrap" >
|
|
<label for="chart_type">'.$mod_strings["LBL_CHART_TYPE"].'</label>
|
|
</td>
|
|
<td scope="row_val" nowrap="nowrap" >
|
|
<select id="chart_type" name="chart_type" style="width: 250px">';
|
|
echo '<option '. ($chart_type == "weekly" ? "selected" : "") .' value="weekly">'.$mod_strings['LBL_CHART_WEEKLY'].'</option>';
|
|
echo '<option '. ($chart_type == "monthly" ? "selected" : "") .' value="monthly">'.$mod_strings['LBL_CHART_MONTHLY'].'</option>';
|
|
echo '<option '. ($chart_type == "quarterly" ? "selected" : "") .' value="quarterly">'.$mod_strings['LBL_CHART_QUARTERLY'].'</option>';
|
|
echo '</select><br /><br />';
|
|
echo '</td>';
|
|
|
|
|
|
echo '<td scope="row_label" nowrap="nowrap" >
|
|
<label for="field_chart">'.$mod_strings["LBL_DATE_START"].'</label>
|
|
</td>
|
|
<td scope="row_val" nowrap="nowrap" >
|
|
<input id="date_start" type="text" name="date_start" value="'.$start_date.'" size=8 readonly/>
|
|
<span id="date_start_trigger" class="suitepicon suitepicon-module-calendar"></span>
|
|
</td>
|
|
<td scope="row_label" nowrap="nowrap" >
|
|
<label for="field_chart"> </label>
|
|
</td>
|
|
<td scope="row_val" nowrap="nowrap" >
|
|
<input id="date_end" class="date_chart" type="hidden" name="date_end" value="'.$end_date.'" />
|
|
</td>';
|
|
|
|
echo '<script type="text/javascript">
|
|
var now = new Date();
|
|
Calendar.setup
|
|
({
|
|
inputField : "date_start",
|
|
ifFormat : cal_date_format,
|
|
daFormat : "%m/%d/%Y %I:%M%P",
|
|
button : "date_start_trigger",
|
|
singleClick : true,
|
|
step : 1,
|
|
weekNumbers: false,
|
|
startWeekday: 0
|
|
});
|
|
</script>';
|
|
|
|
echo '</tr>
|
|
<tr>
|
|
<td style="padding:5px;">
|
|
<a class="utilsLink" href="#" id="create_link">'.$mod_strings['LBL_RESOURCE_CHART_SEARCH_BUTTON'].'</a>
|
|
</td>
|
|
</tr>
|
|
</table>';
|
|
|
|
|
|
|
|
|
|
echo '<table class="main_table">
|
|
<tr class="select_row">
|
|
<td colspan="100%">
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="100%">
|
|
<table style="border: none; table-layout: fixed; width: 100%;" class="main_table" width="100%" cellspacing="0" cellpadding="0" border="0">
|
|
<tr>
|
|
<td class="top_row" style="text-align: left; width: 20%;"><a id="prev_month" href="index.php?module=Project&action=ResourceList"><img width="6" height="10" border="0" align="absmiddle" alt="Previous Month" src="themes/default/images/calendar_previous.gif"> '.$mod_strings['LBL_RESOURCE_CHART_PREVIOUS_MONTH'].'</a></td>
|
|
<td class="top_row" style="text-align: center; width: 60%;"><span class="heading_chart">'.$mod_strings['LBL_RESOURCE_CHART'].'</span></td>
|
|
<td class="top_row" style="padding-right:5px; text-align: right; width: 20%;"><a id="next_month" href="index.php?module=Project&action=ResourceList">'.$mod_strings['LBL_RESOURCE_CHART_NEXT_MONTH'].' <img width="6" height="10" border="0" align="absmiddle" alt="Next Month" src="themes/default/images/calendar_next.gif"></a></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
</tr>';
|
|
echo '<tr>';
|
|
|
|
//weekly view
|
|
if ($chart_type == "weekly" || $chart_type == "") {
|
|
echo '<td class="main_table week">'.$mod_strings['LBL_RESOURCE_CHART_WEEK'].'</td>';
|
|
foreach ($weeks as $week) {
|
|
echo '<td class="main_table weeks" colspan="7">'.$week.'</td>';
|
|
}
|
|
|
|
echo '</tr><tr><td rowspan="3" class="main_table day">'.$mod_strings['LBL_RESOURCE_CHART_DAY'].'</td>';
|
|
foreach ($time_span as $year => $months) {
|
|
foreach ($months as $month => $days) {//count the number of days in each month
|
|
|
|
$daycount=0;
|
|
foreach ($days as $day) {
|
|
$daycount++;
|
|
}
|
|
$width = $daycount * 26; //used to set width on years row. width needed for css text clipping
|
|
echo '<td colspan="'.$daycount.'" class="main_table years"><div style="width: '.$width.'px;" class="year_div">'.$month.', '.$year.'</div></td>';
|
|
}
|
|
}
|
|
echo '</tr><tr class="days_row">';
|
|
|
|
$month_count = 0;//start month count
|
|
foreach ($time_span as $year => $months) {
|
|
foreach ($months as $days) {
|
|
foreach ($days as $day => $d) {
|
|
echo '<td class="inner_td"><div class="cell_width">'.$day.'</div></td>';//day number shown
|
|
}
|
|
}
|
|
}
|
|
echo '</tr><tr class="days_row">';
|
|
|
|
foreach ($time_span as $year => $months) {
|
|
foreach ($months as $days) {
|
|
foreach ($days as $day => $d) {
|
|
echo '<td class="inner_td"><div class="cell_width">'.$d.'</div></td>';//First letter of the days name shown
|
|
}
|
|
}
|
|
}
|
|
|
|
echo '</tr>';
|
|
|
|
foreach ($resources as $resource) {
|
|
$count = $resource->task_count;
|
|
|
|
if ($resource->type == 'project_users_1_c') {
|
|
$user_obj = BeanFactory::newBean('Users');
|
|
$user_obj->retrieve($resource->id);
|
|
|
|
echo '<tr id="'.$resource->id.'" class="task_row"><td no class="main_table no_wrap"><a title="'.$mod_strings["LBL_RESOURCE_TYPE_TITLE_USER"].'" href="index.php?module=Users&action=DetailView&record='.$resource->id.'">'.$user_obj->full_name.'</a></td>';
|
|
} elseif ($resource->type == 'project_contacts_1_c') {
|
|
$contact_obj = BeanFactory::newBean('Contacts');
|
|
$contact_obj->retrieve($resource->id);
|
|
|
|
echo '<tr id="'.$resource->id.'" class="task_row"><td no class="main_table no_wrap"><a title="'.$mod_strings["LBL_RESOURCE_TYPE_TITLE_CONTACT"].'" href="index.php?module=Contacts&action=DetailView&record='.$resource->id.'">'.$contact_obj->full_name.'</a></td>';
|
|
}
|
|
|
|
$i=0;
|
|
for ($x=0; $x< $day_count; $x++) {
|
|
$dateq = $this->get_date($start_date, $i);
|
|
|
|
$class = '';
|
|
|
|
if ($this->check_weekend($dateq) == 'today') {
|
|
$class = 'today';
|
|
} elseif ($this->check_weekend($dateq) == 'weekend') {
|
|
$class = 'weekend';
|
|
} elseif ($this->check_weekend($dateq) == 'weekend-today') {
|
|
$class = 'weekend-today';
|
|
}
|
|
$square = '';
|
|
$dup = 0;
|
|
|
|
for ($c=0; $c < $count; $c++) {
|
|
if ($x == $resource->tasks[$c]['start_day']) {
|
|
$dup++;
|
|
$square = '<td class="inner_td"><div style="color: #ffffff;" rel="'.$dateq.'|'.$dateq.'|'.$resource->id.'|'.$resource->type.'" class="cell_width day_block '.$class.' ' . $this->get_cell_class($dup) .'"></div></td>';
|
|
} elseif ($x > $resource->tasks[$c]['start_day'] && $x <= $resource->tasks[$c]['end_day']) {
|
|
$dup++;
|
|
$square = '<td class="inner_td"><div rel="'.$dateq.'|'.$dateq.'|'.$resource->id.'|'.$resource->type.'" class="cell_width day_block '.$class.' ' . $this->get_cell_class($dup) .'"></div></td>';
|
|
}
|
|
}
|
|
|
|
if ($square == '') {
|
|
$square = '<td class="inner_td"><div class="cell_width day_block"><div class="'.$class.'"></div></div></td>';
|
|
}
|
|
echo $square;
|
|
$i++;
|
|
}
|
|
}
|
|
}//end weekly view
|
|
|
|
elseif ($chart_type == "monthly") {
|
|
echo '<td class="main_table week">'.$mod_strings['LBL_RESOURCE_CHART_MONTH'].'</td>';
|
|
/*foreach ($weeks as $week)
|
|
{
|
|
echo '<td class="main_table weeks" colspan="7">'.$week.'</td>';
|
|
}*/
|
|
|
|
foreach ($time_span as $year => $months) {
|
|
foreach ($months as $month => $weeks) {//count the number of days in each month
|
|
|
|
echo '<td class="main_table weeks" colspan="' . (is_countable($weeks) ? count($weeks) : 0) . '">'.$month .'</td>';
|
|
}
|
|
}
|
|
|
|
echo '</tr><tr><td rowspan="3" class="main_table day">'.$mod_strings['LBL_RESOURCE_CHART_WEEK'].'</td>';
|
|
foreach ($time_span as $year => $months) {
|
|
$wcount= 0;
|
|
foreach ($months as $month => $weeks) {//count the number of weeks in each month
|
|
/*foreach ($weeks as $week)
|
|
{
|
|
$wcount++;
|
|
}*/
|
|
$wcount+= is_countable($weeks) ? count($weeks) : 0;
|
|
}
|
|
$width = $wcount * 26; //used to set width on years row. width needed for css text clipping
|
|
echo '<td colspan="'.$wcount.'" class="main_table years"><div style="width: '.$width.'px;" class="year_div">' . $year.'</div></td>';
|
|
}
|
|
echo '</tr><tr class="days_row">';
|
|
|
|
$month_count = 0;//start month count
|
|
foreach ($time_span as $year => $months) {
|
|
foreach ($months as $weeks) {
|
|
foreach ($weeks as $week => $w) {
|
|
echo '<td class="inner_td"><div class="cell_width">'.$w.'</div></td>';//day number shown
|
|
}
|
|
}
|
|
}
|
|
|
|
echo '</tr><tr class="days_row">';
|
|
|
|
foreach ($time_span as $year => $months) {
|
|
foreach ($months as $weeks) {
|
|
foreach ($weeks as $week => $d) {
|
|
echo '<td class="inner_td"><div class="cell_width">'. ($week + 1) .'</div></td>';//First letter of the days name shown
|
|
}
|
|
}
|
|
}
|
|
|
|
echo '</tr>';
|
|
|
|
foreach ($resources as $resource) {
|
|
$count = $resource->task_count;
|
|
|
|
if ($resource->type == 'project_users_1_c') {
|
|
$user_obj = BeanFactory::newBean('Users');
|
|
$user_obj->retrieve($resource->id);
|
|
|
|
echo '<tr id="'.$resource->id.'" class="task_row"><td no class="main_table no_wrap"><a title="'.$mod_strings["LBL_RESOURCE_TYPE_TITLE_USER"].'" href="index.php?module=Users&action=DetailView&record='.$resource->id.'">'.$user_obj->full_name.'</a></td>';
|
|
} elseif ($resource->type == 'project_contacts_1_c') {
|
|
$contact_obj = BeanFactory::newBean('Contacts');
|
|
$contact_obj->retrieve($resource->id);
|
|
|
|
echo '<tr id="'.$resource->id.'" class="task_row"><td no class="main_table no_wrap"><a title="'.$mod_strings["LBL_RESOURCE_TYPE_TITLE_CONTACT"].'" href="index.php?module=Contacts&action=DetailView&record='.$resource->id.'">'.$contact_obj->full_name.'</a></td>';
|
|
}
|
|
|
|
$i=0;
|
|
for ($x=0; $x< $day_count; $x++) {
|
|
//Get dates for each week
|
|
$dateq = $this->get_week_dates($start_date, $x);
|
|
|
|
$class = '';
|
|
|
|
$square = '';
|
|
$dup = 0;
|
|
|
|
for ($c=0; $c < $count; $c++) {
|
|
if ($x == floor($resource->tasks[$c]['start_day'] /7) && ($resource->tasks[$c]['start_day'] /7) > 0) {
|
|
$dup++;
|
|
$square = '<td class="inner_td"><div style="color: #ffffff;" rel="'.$dateq.'|'.$resource->id.'|'.$resource->type.'" class="cell_width day_block '.$class.' ' . $this->get_cell_class($dup) .'"></div></td>';
|
|
} elseif ($x > floor($resource->tasks[$c]['start_day']/7) && $x <= floor($resource->tasks[$c]['end_day']/7)) {
|
|
$dup++;
|
|
$square = '<td class="inner_td"><div rel="'.$dateq.'|'.$resource->id.'|'.$resource->type.'" class="cell_width day_block '.$class.' ' . $this->get_cell_class($dup) .'"></div></td>';
|
|
}
|
|
}
|
|
|
|
if ($square == '') {
|
|
$square = '<td class="inner_td"><div class="cell_width day_block"><div class="'.$class.'"></div></div></td>';
|
|
}
|
|
echo $square;
|
|
$i++;
|
|
}
|
|
}
|
|
}
|
|
//end monthly view
|
|
|
|
elseif ($chart_type == "quarterly") {
|
|
echo '<td class="main_table week">'.$mod_strings['LBL_RESOURCE_CHART_QUARTER'].'</td>';
|
|
foreach ($time_span as $year => $quarters) {
|
|
foreach ($quarters as $quarter => $months) {//count the number of days in each month
|
|
|
|
echo '<td class="main_table weeks" colspan="' . (is_countable($months) ? count($months) : 0) . '">'.$quarter .'</td>';
|
|
}
|
|
}
|
|
|
|
echo '</tr><tr><td rowspan="3" class="main_table day">'.$mod_strings['LBL_RESOURCE_CHART_MONTH'].'</td>';
|
|
foreach ($time_span as $year => $quarters) {
|
|
$qcount= 0;
|
|
foreach ($quarters as $quarter => $months) {//count the number of months in each quarter
|
|
|
|
$qcount+= is_countable($months) ? count($months) : 0;
|
|
}
|
|
$width = $qcount * 26; //used to set width on years row. width needed for css text clipping
|
|
echo '<td colspan="'.$qcount.'" class="main_table years"><div style="width: '.$width.'px;" class="year_div">' . $year.'</div></td>';
|
|
}
|
|
echo '</tr><tr class="days_row">';
|
|
|
|
$month_count = 0;//start month count
|
|
foreach ($time_span as $year => $quarters) {
|
|
foreach ($quarters as $quarter) {
|
|
foreach ($quarter as $month => $m) {
|
|
echo '<td class="inner_td"><div class="cell_width">'.$month.'</div></td>';//day number shown
|
|
}
|
|
}
|
|
}
|
|
|
|
echo '</tr><tr class="days_row">';
|
|
|
|
foreach ($time_span as $year => $quarters) {
|
|
foreach ($quarters as $quarter) {
|
|
foreach ($quarter as $month => $m) {
|
|
echo '<td class="inner_td"><div class="cell_width">'. $m .'</div></td>';//First letter of the days name shown
|
|
}
|
|
}
|
|
}
|
|
|
|
echo '</tr>';
|
|
|
|
foreach ($resources as $resource) {
|
|
$count = $resource->task_count;
|
|
|
|
if ($resource->type == 'project_users_1_c') {
|
|
$user_obj = BeanFactory::newBean('Users');
|
|
$user_obj->retrieve($resource->id);
|
|
|
|
echo '<tr id="'.$resource->id.'" class="task_row"><td no class="main_table no_wrap"><a title="'.$mod_strings["LBL_RESOURCE_TYPE_TITLE_USER"].'" href="index.php?module=Users&action=DetailView&record='.$resource->id.'">'.$user_obj->full_name.'</a></td>';
|
|
} elseif ($resource->type == 'project_contacts_1_c') {
|
|
$contact_obj = BeanFactory::newBean('Contacts');
|
|
$contact_obj->retrieve($resource->id);
|
|
|
|
echo '<tr id="'.$resource->id.'" class="task_row"><td no class="main_table no_wrap"><a title="'.$mod_strings["LBL_RESOURCE_TYPE_TITLE_CONTACT"].'" href="index.php?module=Contacts&action=DetailView&record='.$resource->id.'">'.$contact_obj->full_name.'</a></td>';
|
|
}
|
|
|
|
|
|
$i=0;
|
|
for ($x=0; $x< $day_count; $x++) {
|
|
//Get date for each day
|
|
$dateq = $this->get_month_dates($start_date, $x);
|
|
|
|
$class = '';
|
|
$square = '';
|
|
$dup = 0;
|
|
|
|
for ($c=0; $c < $count; $c++) {
|
|
$ds_month = $this->count_months($start_date, $resource->tasks[$c]['start_day'], $x);
|
|
$de_month = $this->count_months($start_date, $resource->tasks[$c]['end_day'], $x);
|
|
|
|
if (($ds_month == 0 || $de_month == 0) && $resource->tasks[$c]['start_day'] <= $resource->tasks[$c]['end_day'] && $resource->tasks[$c]['start_day'] >=0 && $resource->tasks[$c]['end_day']>=0) {
|
|
$dup++;
|
|
$square = '<td class="inner_td"><div rel="'.$dateq.'|'.$resource->id.'|'.$resource->type.'" class="cell_width day_block '.$class.' ' . $this->get_cell_class($dup) .'"></div></td>';
|
|
}
|
|
}
|
|
|
|
if ($square == '') {
|
|
$square = '<td class="inner_td"><div class="cell_width day_block"><div class="'.$class.'"></div></div></td>';
|
|
}
|
|
echo $square;
|
|
$i++;
|
|
}
|
|
}
|
|
}
|
|
//end quarterly view
|
|
|
|
echo '</table>';
|
|
}
|
|
|
|
|
|
|
|
//Returns an array containing the years, months and weeks between two dates
|
|
public function year_quarter($start_date, $end_date)
|
|
{
|
|
$begin = new DateTime($start_date);
|
|
$end = new DateTime($end_date);
|
|
$end->add(new DateInterval('P1D')); //Add 1 day to include the end date as a day
|
|
$interval = new DateInterval('P1M'); // 1 week interval
|
|
$period = new DatePeriod($begin, $interval, $end);
|
|
$aResult = array();
|
|
|
|
$count = 0;
|
|
foreach ($period as $dt) {
|
|
$count++;
|
|
$y = $dt->format('Y');
|
|
$c = ceil($dt->format('m')/3);
|
|
$m = mb_substr($GLOBALS['app_list_strings']['dom_cal_month_short'][$dt->format('n')], 0, 3);
|
|
|
|
$aResult[$y][$c][$count] = $m;
|
|
}
|
|
|
|
return array($aResult, $count);
|
|
}
|
|
|
|
|
|
//Returns an array containing the years, months and weeks between two dates
|
|
public function year_week($start_date, $end_date)
|
|
{
|
|
$begin = new DateTime($start_date);
|
|
$end = new DateTime($end_date);
|
|
$end->add(new DateInterval('P1D')); //Add 1 day to include the end date as a day
|
|
$interval = new DateInterval('P1W'); // 1 week interval
|
|
$period = new DatePeriod($begin, $interval, $end);
|
|
$aResult = array();
|
|
|
|
$count = 0;
|
|
foreach ($period as $dt) {
|
|
$count++;
|
|
$y = $dt->format('Y');
|
|
$m = $GLOBALS['app_list_strings']['dom_cal_month_short'][$dt->format('n')];
|
|
$w = $dt->format('W');
|
|
|
|
$aResult[$y][$m][] = $w;
|
|
}
|
|
|
|
return array($aResult, $count);
|
|
}
|
|
|
|
|
|
//Returns an array containing the years, months and days between two dates
|
|
public function year_month($start_date, $end_date)
|
|
{
|
|
$begin = new DateTime($start_date);
|
|
$end = new DateTime($end_date);
|
|
$end->add(new DateInterval('P1D')); //Add 1 day to include the end date as a day
|
|
$interval = new DateInterval('P1D'); // 1 month interval
|
|
$period = new DatePeriod($begin, $interval, $end);
|
|
$aResult = array();
|
|
|
|
foreach ($period as $dt) {
|
|
$y = $dt->format('Y');
|
|
$m = mb_substr($GLOBALS['app_list_strings']['dom_cal_month_short'][$dt->format('n')], 0, 3);
|
|
$j = $dt->format('j');
|
|
$d = mb_substr($GLOBALS['app_list_strings']['dom_cal_day_short'][$dt->format('w')+1], 0, 1);
|
|
|
|
$aResult[$y][$m][$j] = $d;
|
|
}
|
|
|
|
return $aResult;
|
|
}
|
|
|
|
public function get_weeks($start_date, $end_date)
|
|
{
|
|
$begin = new DateTime($start_date);
|
|
$end = new DateTime($end_date);
|
|
$end->add(new DateInterval('P1D')); //Add 1 day to include the end date as a day
|
|
$interval = new DateInterval('P1W'); // 1 week interval
|
|
$period = new DatePeriod($begin, $interval, $end);
|
|
$aResult = array();
|
|
|
|
foreach ($period as $dt) {
|
|
$aResult[] = $dt->format('W');
|
|
}
|
|
|
|
return $aResult;
|
|
}
|
|
|
|
|
|
//count number of months between task start day and chart current month
|
|
public function count_months($start, $day, $x)
|
|
{
|
|
$sdate = DateTime::createFromFormat('Y-m-d', $start);
|
|
$edate = DateTime::createFromFormat('Y-m-d', $start);
|
|
// $date->setTimezone(new DateTimeZone("Europe/London"));
|
|
$sdate->modify('+'.$day.' days');
|
|
$edate->modify('+'.$x.' months');
|
|
|
|
if ($sdate->format('Y') !== $edate->format('Y')) {
|
|
return -1;
|
|
}
|
|
|
|
if ($sdate->format('m') !== $edate->format('m')) {
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
//Returns the total number of days between two dates
|
|
public function count_days($start_date, $end_date)
|
|
{
|
|
$d1 = new DateTime($start_date);
|
|
$d2 = new DateTime($end_date);
|
|
//If the task's end date is before chart's start date return -1 to make sure task starts on first day of the chart
|
|
if ($d2 < $d1) {
|
|
return -1;
|
|
} elseif ($d2 == $d1) {
|
|
return 1;
|
|
}
|
|
// $d2->add(new DateInterval('P1D')); //Add 1 day to include the end date as a day
|
|
$difference = $d1->diff($d2);
|
|
return $difference->days;
|
|
}
|
|
|
|
|
|
//returns first and last date of a week
|
|
public function get_week_dates($start, $weeks)
|
|
{
|
|
$date = DateTime::createFromFormat('Y-m-d', $start);
|
|
|
|
$date->modify('+'.($weeks + 1).' weeks');
|
|
|
|
$ts = strtotime($date->format('Y-m-d'));
|
|
$start = (date('w', $ts) == 0) ? $ts : strtotime('last monday', $ts);
|
|
return date('Y-m-d', $start) . "|" . date('Y-m-d', strtotime('next sunday', $start));
|
|
}
|
|
|
|
//returns first and last date of a month
|
|
public function get_month_dates($start, $months)
|
|
{
|
|
$date = DateTime::createFromFormat('Y-m-d', $start);
|
|
|
|
$date->modify('+'.($months).' months');
|
|
|
|
return $date->format('Y-m-01') . "|" . $date->format('Y-m-t');
|
|
}
|
|
|
|
|
|
//get date of passed in day in relation to the charts start date
|
|
public function get_date($start, $day)
|
|
{
|
|
$date = DateTime::createFromFormat('Y-m-d', $start);
|
|
// $date->setTimezone(new DateTimeZone("Europe/London"));
|
|
$date->modify('+'.$day.' days');
|
|
|
|
return $date->format('Y-m-d');
|
|
}
|
|
|
|
|
|
//checks if the day is a weekend and if the day is today.
|
|
public function check_weekend($day)
|
|
{
|
|
global $current_user;
|
|
//get users timezone setting
|
|
$timezone = TimeDate::userTimezone($current_user);
|
|
$now = new DateTime();
|
|
$now->setTimezone(new DateTimeZone($timezone));
|
|
$date1 = DateTime::createFromFormat('Y-m-d', $day);
|
|
$date = $date1->format('Y-m-d');
|
|
$now = $now->format('Y-m-d');
|
|
// $GLOBALS['log']->fatal("date2 ".$now);
|
|
|
|
if ($date1->format('l') == 'Sunday' && $date === $now) {
|
|
return 'weekend-today';
|
|
} elseif ($date1->format('l') == 'Saturday' && $date === $now) {
|
|
return 'weekend-today';
|
|
} elseif ($date1->format('l') == 'Sunday') {
|
|
return 'weekend';
|
|
} elseif ($date1->format('l') == 'Saturday') {
|
|
return 'weekend';
|
|
} elseif ($date === $now) {
|
|
return 'today';
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
//Returns the time span between two dates in years months and days
|
|
public function time_range($start_date, $end_date)
|
|
{
|
|
$datetime1 = new DateTime($start_date);
|
|
$datetime2 = new DateTime($end_date);
|
|
$interval = $datetime1->diff($datetime2);
|
|
echo $interval->format('%y years %m months and %d days');
|
|
}
|
|
|
|
//returns the css class for cell color/ h => non duplicate, d =>duplicate
|
|
public function get_cell_class($days)
|
|
{
|
|
if ($days > 1) {
|
|
return " d";
|
|
}
|
|
return " h";
|
|
}
|
|
}
|