mirror of
https://github.com/EGroupware/egroupware.git
synced 2024-12-23 15:18:58 +01:00
172 lines
4.6 KiB
PHP
172 lines
4.6 KiB
PHP
<?php
|
|
/**
|
|
* DataSource for the Calendar
|
|
*
|
|
* @link http://www.egroupware.org
|
|
* @package calendar
|
|
* @author RalfBecker-AT-outdoor-training.de
|
|
* @copyright (c) 2005-16 by RalfBecker-AT-outdoor-training.de
|
|
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
|
* @version $Id$
|
|
*/
|
|
|
|
use EGroupware\Api\Link;
|
|
use EGroupware\Api\Acl;
|
|
|
|
include_once(EGW_INCLUDE_ROOT.'/projectmanager/inc/class.datasource.inc.php');
|
|
|
|
/**
|
|
* DataSource for the Calendar
|
|
*/
|
|
class calendar_datasource extends datasource
|
|
{
|
|
/**
|
|
* Constructor
|
|
*/
|
|
function __construct()
|
|
{
|
|
if (false) parent::__construct(); // can not be called, but gives IDE warning
|
|
|
|
$this->datasource('calendar');
|
|
|
|
$this->valid = PM_PLANNED_START|PM_PLANNED_END|PM_PLANNED_TIME|PM_RESOURCES|PM_CAT_ID;
|
|
}
|
|
|
|
/**
|
|
* get an entry from the underlaying app (if not given) and convert it into a datasource array
|
|
*
|
|
* @param mixed $data_id id as used in the link-class for that app, or complete entry as array
|
|
* @return array/boolean array with the data supported by that source or false on error (eg. not found, not availible)
|
|
*/
|
|
function get($data_id)
|
|
{
|
|
// we use $cal as an already running instance is availible there
|
|
if (!is_object($GLOBALS['calendar_bo']))
|
|
{
|
|
$GLOBALS['calendar_bo'] = new calendar_bo();
|
|
}
|
|
$cal = $GLOBALS['calendar_bo'];
|
|
|
|
if (!is_array($data_id))
|
|
{
|
|
if (!(int) $data_id || !($data = $cal->read((int) $data_id)))
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$data =& $data_id;
|
|
}
|
|
$ds = array(
|
|
'pe_title' => $cal->link_title($data),
|
|
'pe_planned_start' => $cal->date2ts($data['start']),
|
|
'pe_planned_end' => $cal->date2ts($data['end']),
|
|
'pe_resources' => array(),
|
|
'pe_details' => $data['description'] ? nl2br($data['description']) : '',
|
|
);
|
|
// return first global category, as PM only supports one
|
|
foreach($data['category'] ? explode(',', $data['category']) : array() as $cat_id)
|
|
{
|
|
if (Api\Categories::is_global($cat_id))
|
|
{
|
|
$ds['cat_id'] = $cat_id;
|
|
break;
|
|
}
|
|
}
|
|
// calculation of the time
|
|
$ds['pe_planned_time'] = (int) (($ds['pe_planned_end'] - $ds['pe_planned_start'])/60); // time is in minutes
|
|
|
|
// if the event spans multiple days, we have to substract the nights (24h - daily working time specified in PM)
|
|
if (($ds['pe_planned_time']/ 60 > 24) && date('Y-m-d',$ds['pe_planned_end']) != date('Y-m-d',$ds['pe_planned_start']))
|
|
{
|
|
$start = $end = null;
|
|
foreach(array('start','end') as $name)
|
|
{
|
|
$arr = $cal->date2array($ds['pe_planned_'.$name]);
|
|
$arr['hour'] = 12;
|
|
$arr['minute'] = ${$name}['second'] = 0;
|
|
unset($arr['raw']);
|
|
$$name = $cal->date2ts($arr);
|
|
}
|
|
$nights = round(($end - $start) / DAY_s);
|
|
|
|
if (!is_array($this->pm_config))
|
|
{
|
|
$this->pm_config = Api\Config::read('projectmanager');
|
|
if (!$this->pm_config['hours_per_workday']) $this->pm_config['hours_per_workday'] = 8;
|
|
}
|
|
$ds['pe_planned_time'] -= $nights * 60 * (24 - $this->pm_config['hours_per_workday']);
|
|
}
|
|
foreach($data['participants'] as $uid => $status)
|
|
{
|
|
if ($status != 'R' && is_numeric($uid)) // only users for now
|
|
{
|
|
$ds['pe_resources'][] = $uid;
|
|
}
|
|
}
|
|
// if we have multiple participants we have to multiply the time by the number of participants to get the total time
|
|
$ds['pe_planned_time'] *= count($ds['pe_resources']);
|
|
|
|
if($data['deleted'])
|
|
{
|
|
$ds['pe_status'] = 'deleted';
|
|
}
|
|
/*
|
|
// ToDO: this does not change automatically after the event is over,
|
|
// maybe we need a flag for that in egw_pm_elements
|
|
if ($data['end']['raw'] <= time()+$GLOBALS['egw']->datetime->tz_offset)
|
|
{
|
|
$ds['pe_used_time'] = $ds['pe_planned_time'];
|
|
}
|
|
*/
|
|
if ($this->debug)
|
|
{
|
|
echo "datasource_calendar($data_id) data="; _debug_array($data);
|
|
echo "datasource="; _debug_array($ds);
|
|
}
|
|
return $ds;
|
|
}
|
|
|
|
/**
|
|
* Delete the datasource of a project element
|
|
*
|
|
* @param int $id
|
|
* @return boolean true on success, false on error
|
|
*/
|
|
function delete($id)
|
|
{
|
|
// dont delete entries which are linked to elements other than their project
|
|
if (count(Link::get_links('calendar',$id)) > 1)
|
|
{
|
|
return false;
|
|
}
|
|
$bo = new calendar_boupdate();
|
|
return $bo->delete($id);
|
|
}
|
|
|
|
/**
|
|
* Change the status of an entry according to the project status
|
|
*
|
|
* @param int $id
|
|
* @param string $status
|
|
* @return boolean true if status changed, false otherwise
|
|
*/
|
|
function change_status($id,$status)
|
|
{
|
|
$bo = new calendar_boupdate();
|
|
if (($entry = $bo->read($id)) && (
|
|
$bo->check_perms(Acl::EDIT,$entry)
|
|
))
|
|
{
|
|
// Restore from deleted
|
|
if ($status == 'active' && $entry['deleted'])
|
|
{
|
|
$entry['deleted'] = null;
|
|
return (boolean)$bo->update($entry, true);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
}
|