* * -------------------------------------------- * * This program is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2 of the License. * \**************************************************************************/ /* $Id$ */ require_once EGW_SERVER_ROOT.'/infolog/inc/class.boinfolog.inc.php'; require_once EGW_SERVER_ROOT.'/phpgwapi/inc/horde/Horde/iCalendar.php'; class vcalinfolog extends boinfolog { var $status2vtodo = array( 'offer' => 'NEEDS-ACTION', 'not-started' => 'NEEDS-ACTION', 'ongoing' => 'IN-PROCESS', 'done' => 'COMPLETED', 'cancelled' => 'CANCELLED', 'billed' => 'DONE', 'call' => 'NEEDS-ACTION', 'will-call' => 'IN-PROCESS', ); var $vtodo2status = array( 'NEEDS-ACTION' => 'not-started', 'IN-PROCESS' => 'ongoing', 'COMPLETED' => 'done', 'CANCELLED' => 'cancelled', ); var $egw_priority2vcal_priority = array( 0 => 3, 1 => 2, 2 => 1, 3 => 1, ); var $vcal_priority2egw_priority = array( 1 => 2, 2 => 1, 3 => 0, ); function exportVTODO($_taskID, $_version) { $taskData = $this->read($_taskID); $taskData = $GLOBALS['egw']->translation->convert($taskData, $GLOBALS['egw']->translation->charset(), 'UTF-8'); //_debug_array($taskData); $taskGUID = $GLOBALS['egw']->common->generate_uid('infolog_task',$_taskID); #print "
"; #print $GLOBALS['egw']->contenthistory->getTSforAction($eventGUID,'add'); #print "
"; $vcal = &new Horde_iCalendar; $vcal->setAttribute('VERSION',$_version); $vcal->setAttribute('METHOD','PUBLISH'); $vevent = Horde_iCalendar::newComponent('VTODO',$vcal); $options = array(); $vevent->setAttribute('SUMMARY',$taskData['info_subject']); $vevent->setAttribute('DESCRIPTION',$taskData['info_des']); $vevent->setAttribute('LOCATION',$taskData['info_location']); if($taskData['info_startdate']) $vevent->setAttribute('DTSTART',$taskData['info_startdate']); if($taskData['info_enddate']) $vevent->setAttribute('DUE',$taskData['info_enddate']); if($taskData['info_datecompleted']) $vevent->setAttribute('COMPLETED',$taskData['info_datecompleted']); $vevent->setAttribute('DTSTAMP',time()); $vevent->setAttribute('CREATED',$GLOBALS['egw']->contenthistory->getTSforAction($eventGUID,'add')); $vevent->setAttribute('LAST-MODIFIED',$GLOBALS['egw']->contenthistory->getTSforAction($eventGUID,'modify')); $vevent->setAttribute('UID',$taskGUID); $vevent->setAttribute('CLASS',$taskData['info_access'] == 'public' ? 'PUBLIC' : 'PRIVATE'); $vevent->setAttribute('STATUS',isset($this->status2vtodo[$taskData['info_status']]) ? $this->status2vtodo[$taskData['info_status']] : 'NEEDS-ACTION'); $vevent->setAttribute('PRIORITY',$this->egw_priority2vcal_priority[$taskData['info_priority']]); #$vevent->setAttribute('TRANSP','OPAQUE'); # status # ATTENDEE $options = array('CHARSET' => 'UTF-8','ENCODING' => 'QUOTED-PRINTABLE'); $vevent->setParameter('SUMMARY', $options); $vevent->setParameter('DESCRIPTION', $options); $vcal->addComponent($vevent); #print "
";
			#print $vcal->exportvCalendar();
			#print "
"; return $vcal->exportvCalendar(); } function importVTODO(&$_vcalData, $_taskID=-1) { if(!$taskData = $this->vtodotoegw($_vcalData)) { return false; } if($_taskID > 0) { $taskData['info_id'] = $_taskID; } // we suppose that a not set status in a vtodo means that the task did not started yet if(empty($taskData['info_status'])) { $taskData['info_status'] = 'not-started'; } #_debug_array($taskData);exit; return $this->write($taskData); } function searchVTODO($_vcalData) { if(!$egwData = $this->vtodotoegw($_vcalData)) { return false; } #unset($egwData['info_priority']); $filter = array('col_filter' => $egwData); if($foundItems = $this->search($filter)) { if(count($foundItems) > 0) { $itemIDs = array_keys($foundItems); return $itemIDs[0]; } } return false; } function vtodotoegw($_vcalData) { $vcal = &new Horde_iCalendar; if(!$vcal->parsevCalendar($_vcalData)) { return FALSE; } $components = $vcal->getComponents(); if(count($components) > 0) { $component = $components[0]; if(is_a($component, 'Horde_iCalendar_vtodo')) { if($_taskID>0) $taskData['info_id'] = $_taskID; foreach($component->_attributes as $attributes) { #print $attributes['name'].' - '.$attributes['value'].'
'; switch($attributes['name']) { case 'CLASS': $taskData['info_access'] = strtolower($attributes['value']); break; case 'DESCRIPTION': $taskData['info_des'] = $attributes['value']; break; case 'LOCATION': $taskData['info_location'] = $attributes['value']; break; case 'DUE': $taskData['info_enddate'] = $attributes['value']; break; case 'COMPLETED': $taskData['info_datecompleted'] = $attributes['value']; break; case 'DTSTART': $taskData['info_startdate'] = $attributes['value']; break; case 'PRIORITY': if (1 <= $attributes['value'] && $attributes['value'] <= 3) { $taskData['info_priority'] = $this->vcal_priority2egw_priority[$attributes['value']]; } else { $taskData['info_priority'] = 1; // default = normal } break; case 'STATUS': $taskData['info_status'] = isset($this->vtodo2status[strtoupper($attributes['value'])]) ? $this->vtodo2status[strtoupper($attributes['value'])] : 'ongoing'; break; case 'SUMMARY': $taskData['info_subject'] = $attributes['value']; break; } } # the horde ical class does already convert in parsevCalendar # do NOT convert here #$taskData = $GLOBALS['egw']->translation->convert($taskData, 'UTF-8'); return $taskData; } } return FALSE; } }