You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2087 lines
64 KiB
2087 lines
64 KiB
<?php
|
|
/*
|
|
* Copyright 1999 - 2004 by Gero Kohnert
|
|
*
|
|
* CVS Info: $Id: appointment.pinc,v 1.22 2005/07/15 12:02:22 indigoleopard Exp $
|
|
* $Author: indigoleopard $
|
|
*/
|
|
|
|
global $callink;
|
|
$callink = 'index.php?module=Calendar&action=';
|
|
define ('APP_NOREP',0);
|
|
define ('APP_REP_WEEK',1);
|
|
define ('APP_REP_MONTH',2);
|
|
define ('APP_REP_YEAR',3);
|
|
define ('APP_REP_DAY',4);
|
|
|
|
define ('CAL_EVERYTHING',0);
|
|
define ('CAL_MYOWN',1);
|
|
define ('CAL_OWNTEAMS',2);
|
|
define ('CAL_ALLTOSEE',3);
|
|
|
|
define ('CAL_MODALL',0);
|
|
define ('CAL_MODPART',1);
|
|
define ('CAL_MODUSER',2);
|
|
define ('CAL_MODPRIV',3);
|
|
|
|
define ('APP_STATE_UNKNOWN',0);
|
|
define ('APP_STATE_YES',1);
|
|
|
|
include_once 'modules/Calendar/base.pinc';
|
|
require_once('include/database/PearDatabase.php');
|
|
//require_once('modules/Calls/Call.php');
|
|
|
|
/**
|
|
* options for calendar selection
|
|
*/
|
|
function cal_options($team,$teamname) {
|
|
global $lang,$current_user;
|
|
|
|
echo "<select name=\"team\">\n";
|
|
$showed = 0;
|
|
|
|
$useOPTGROUP = true;
|
|
if (!isset ($_SERVER['HTTP_USER_AGENT'])) {
|
|
$useOPTGROUP = false;
|
|
}
|
|
if ($useOPTGROUP && ereg("Opera",$_SERVER['HTTP_USER_AGENT'])) {
|
|
$useOPTGROUP = false;
|
|
}
|
|
if ($useOPTGROUP && ereg ("MSIE.*Mac",$_SERVER['HTTP_USER_AGENT'])) {
|
|
$useOPTGROUP = false;
|
|
}
|
|
if ($useOPTGROUP) {
|
|
echo " <optgroup label=\"". $lang['Teams'] ."\">\n";
|
|
}
|
|
foreach ( $current_user->t_parties as $i => $f ) {
|
|
echo " <option value=\"". $i ."\"". ($team == $i ? " selected=\"selected\"" : "") .">". myentities($f) ."</option>\n";
|
|
if ( $team == $i ) {
|
|
$showed = 1;
|
|
}
|
|
}
|
|
if ($useOPTGROUP) {
|
|
echo " </optgroup>\n";
|
|
}
|
|
echo " <option value=\"". CAL_MYOWN ."\"". ($team == CAL_MYOWN ? " selected=\"selected\"" : "") .">". $lang['User'] ." ". $current_user->getFullname() ."</option>\n";
|
|
if ( $team == CAL_MYOWN ) {
|
|
$showed = 1;
|
|
}
|
|
echo " <option value=\"". CAL_OWNTEAMS ."\"". ($team == CAL_OWNTEAMS ? " selected=\"selected\"" : "") .">". $lang['AppAllTeams'] ."</option>\n";
|
|
if ( $team == CAL_OWNTEAMS ) {
|
|
$showed = 1;
|
|
}
|
|
echo " <option value=\"". CAL_ALLTOSEE ."\"". ($team == CAL_ALLTOSEE ? " selected=\"selected\"" : "") .">". $lang['AppAllSee'] ."</option>\n";
|
|
if ( $team == CAL_ALLTOSEE ) {
|
|
$showed = 1;
|
|
}
|
|
if ( $current_user->isadmin() ) {
|
|
echo " <option value=\"". CAL_EVERYTHING ."\"". ($team == CAL_EVERYTHING ? " selected=\"selected\"" : "") .">". $lang['AppEverything'] ."</option>\n";
|
|
if ( $team == CAL_EVERYTHING ) {
|
|
$showed = 1;
|
|
}
|
|
}
|
|
if ( $showed != 1 ) {
|
|
echo " <option value=\"". $team ."\" selected=\"selected\">". $teamname ."</option>\n";
|
|
}
|
|
echo " </select>\n";
|
|
echo " <input type=\"submit\" value=\"GO\" />";
|
|
}
|
|
|
|
/**
|
|
* check a date against a list of objects
|
|
* returns boolean
|
|
*/
|
|
function cal_check_against_list(&$obj,&$uids) {
|
|
|
|
if ( isset($uids[0]) ) {
|
|
return true;
|
|
}
|
|
if ( ! $obj->see_ok() ){
|
|
return false;
|
|
}
|
|
|
|
/* if user is not interessted in - show nothing */
|
|
if ( $obj->gettype() == "appointment" ) {
|
|
# Check Participants
|
|
foreach ( $obj->participant as $f) {
|
|
if ( array_key_exists($f->id,$uids)) {
|
|
return true;
|
|
}
|
|
unset($f);
|
|
}
|
|
# Check Project
|
|
if ( array_key_exists($obj->product->id,$uids)) {
|
|
return true;
|
|
}
|
|
# Visitor
|
|
if ( ($obj->visitor != -1) && array_key_exists($obj->visitor->id,$uids)) {
|
|
return true;
|
|
}
|
|
# Check Resources
|
|
if ( class_exists ("resource") ) {
|
|
resource::obj_read($obj);
|
|
foreach ($obj->resuselist as $i =>$f) {
|
|
if ( array_key_exists($f->id,$uids)) {
|
|
return true;
|
|
}
|
|
unset($f);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
if ( $obj->gettype() == "note" ) {
|
|
return true;
|
|
}
|
|
if ( $obj->gettype() == "task" ) {
|
|
return true;
|
|
}
|
|
if ( $obj->gettype() == "watchlist" ) {
|
|
return true;
|
|
}
|
|
if ( $obj->gettype() == "reminder" ) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* set some defaults for calendar display
|
|
*/
|
|
function cal_setDefault(&$user,&$uids) {
|
|
/* show apps for current user */
|
|
$uids[$user->id] = 1;
|
|
foreach ($user->teamlist as $i => $f) {
|
|
$uids[$i] = 1;
|
|
}
|
|
}
|
|
/**
|
|
* parse the calendar options
|
|
*/
|
|
function cal_parse_options(&$user,&$teamname) {
|
|
global $lang,$current_user;
|
|
|
|
$uids = array();
|
|
if ( isset($_GET['team']) ) {
|
|
$team = $_GET['team'];
|
|
$x = $user->set_prefteam($team);
|
|
} //else {
|
|
/* Get the last used team */
|
|
//$team = $user->get_prefteam();
|
|
//}
|
|
//$user->readKnownParties();
|
|
|
|
/* Get group or user whose calendar should be displayed */
|
|
/* default to current checked in user */
|
|
if ( ($team == CAL_EVERYTHING) && ! is_admin($current_user) ) {
|
|
$team = CAL_MYOWN;
|
|
}
|
|
if ( $team == CAL_EVERYTHING ) {
|
|
$uids[0] = 1;
|
|
} elseif ( $team == CAL_MYOWN) {
|
|
cal_setDefault($user,$uids);
|
|
} elseif ( $team == CAL_OWNTEAMS) {
|
|
/* show apps for all teams members of current users teams */
|
|
$uids[$user->id] = 1;
|
|
foreach($user->teamlist as $i => $f ) {
|
|
$uids[$i] = 1;
|
|
$tt = new team($user->dbconn);
|
|
$tt = $tt->read($i,$tt);
|
|
$tt->read_member();
|
|
foreach($tt->member as $i1 => $f1 ) {
|
|
$uids[$i1] = 1;
|
|
# Add all teams where this member is also a member
|
|
# so you can see if this one is occupied by a team event
|
|
# of one of his/her teams
|
|
if (!isset($tt->member[$i1]->teamlist)) {
|
|
team::obj_read($tt->member[$i1]);
|
|
}
|
|
foreach($tt->member[$i1]->teamlist as $i2 => $f2 ) {
|
|
$uids[$i2] = 1;
|
|
}
|
|
}
|
|
unset($tt);
|
|
}
|
|
} elseif ( $team == CAL_ALLTOSEE) {
|
|
/* show apps for all teams members of current users teams */
|
|
/* and all users and teams we are allowed to see (ACL) */
|
|
$uids[$user->id] = 1;
|
|
foreach($user->a_parties as $ip => $fn ) {
|
|
$uids[$ip] = 1;
|
|
}
|
|
foreach($user->t_parties as $ip => $fn ) {
|
|
$uids[$ip] = 1;
|
|
$tt = new team($user->dbconn);
|
|
$tt = $tt->read($ip,$tt);
|
|
foreach($tt->ids as $i1 => $f1 ) {
|
|
$uids[$i1] = 1;
|
|
}
|
|
unset($tt);
|
|
}
|
|
} else {
|
|
$tt = getObject($user->dbconn,$team);
|
|
if ( $tt == -1 ) {
|
|
} else if ( $tt->getType() == "team" ) {
|
|
if ( $tt->see_ok() ) {
|
|
# Team
|
|
$uids[$team] = 1;
|
|
$teamname = $tt->name;
|
|
$tt->read_member();
|
|
foreach($tt->member as $i1 => $f1 ) {
|
|
$uids[$i1] = 1;
|
|
# Check the teams where this user is also a member
|
|
if (!isset($tt->member[$i1]->teamlist)) {
|
|
team::obj_read($tt->member[$i1]);
|
|
}
|
|
foreach($tt->member[$i1]->teamlist as $i2 => $f2 ) {
|
|
$uids[$i2] = 1;
|
|
}
|
|
}
|
|
} else {
|
|
$msg .= sprintf($lang['Err0022'],$lang['Calendar']."(". $lang['Team']." ".$tt->getFullName().")");
|
|
cal_setDefault($user,$uids);
|
|
}
|
|
} else if ( $tt->getType() == "user" ) {
|
|
if ( $tt->see_ok() ) {
|
|
$uids[$team] = 1;
|
|
$teamname = $lang['User'] ." ". $tt->getFullname();
|
|
# All Teams where the user is a member
|
|
foreach($tt->teamlist as $i => $f ) {
|
|
$uids[$i] = 1;
|
|
}
|
|
} else {
|
|
$msg .= sprintf($lang['Err0022'],$lang['Calendar']."(". $lang['User']." ".$tt->getFullName().")");
|
|
cal_setDefault($user,$uids);
|
|
}
|
|
} else if ( $tt->getType() == "product" ) {
|
|
if ( $tt->see_ok() ) {
|
|
$teamname = $lang[$tt->getType()] ." ". $tt->getFullname();
|
|
# put all the team members on the list
|
|
$tt->readroles();
|
|
$uids[$tt->id] = 1;
|
|
foreach ($lang['ProdRole'] as $role => $x ) {
|
|
foreach ($tt->role[$role] as $i => $r) {
|
|
$uids[$i] = 1;
|
|
}
|
|
}
|
|
} else {
|
|
$msg .= sprintf($lang['Err0022'],$lang['Calendar']."(". $lang[$tt->getType()]." ".$tt->getFullName().")");
|
|
cal_setDefault($user,$uids);
|
|
}
|
|
} else {
|
|
if ( $tt->see_ok() ) {
|
|
$teamname = $lang[$tt->getType()] ." ". $tt->getFullname();
|
|
$uids[$team] = 1;
|
|
} else {
|
|
$msg .= sprintf($lang['Err0022'],$lang['Calendar']."(". $lang[$tt->getType()]." ".$tt->getFullName().")");
|
|
cal_setDefault($user,$uids);
|
|
}
|
|
}
|
|
}
|
|
return $uids;
|
|
}
|
|
/**
|
|
* List all appointments
|
|
* cols > 0 make sperate rows with cols columns for each appointment
|
|
*/
|
|
function showApps(&$user,&$obj,$cols,$ext = 0,$rows = 0) {
|
|
global $tutos, $lang;
|
|
|
|
$n = 1;
|
|
$xx = $obj->applist;
|
|
$x = count($xx);
|
|
|
|
if ( $rows == 0 ) {
|
|
$rows = $tutos[maxshort];
|
|
}
|
|
if ( $rows == -1 ) {
|
|
$rows = count($obj->applist);
|
|
}
|
|
|
|
@reset ($xx);
|
|
while ( list ($i,$f) = @each ($xx) ) {
|
|
if ( $cols > 0 ) {
|
|
echo "<tr><td colspan=\"". $cols ."\">\n";
|
|
}
|
|
if ( ($n >= $rows) && ( $x > $rows ) ) {
|
|
echo " ". $user->layout->theme->getImage(folder,'list') ." ". makelink("app_overview.php?link_id=". $obj->id,sprintf($lang['AllEntries'], count($obj->applist)));
|
|
if ( $cols > 0 ) {
|
|
echo "</td></tr>\n";
|
|
}
|
|
break;
|
|
}
|
|
echo $f->getLink();
|
|
if ( ($ext == 1) && ($f->product->id != -1) ) {
|
|
echo " → ". $f->product->getLink();
|
|
}
|
|
if ( ($ext == 2) && ($f->visitor != -1) ) {
|
|
echo " ";
|
|
if ( $f->outside ) {
|
|
echo $lang['VisitAt'] .": ";
|
|
} else {
|
|
echo $lang['VisitFrom'] .": ";
|
|
}
|
|
echo $f->visitor->getLink();
|
|
}
|
|
echo "<br />\n";
|
|
if ( $cols > 0 ) {
|
|
echo "</td></tr>\n";
|
|
}
|
|
$n++;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* a appointment (meeting etc.)
|
|
*
|
|
* @package appointment
|
|
*/
|
|
class appointment extends tutos_base {
|
|
|
|
/* ---------------------------------------------------------------------------
|
|
*/
|
|
var $db;
|
|
function appointment() {
|
|
global $table,$current_user;
|
|
|
|
#$this->init($dbconn);
|
|
$this->db = new PearDatabase();
|
|
|
|
# if ( ! class_exists ("product") ) {
|
|
# require_once 'product.pinc';
|
|
# }
|
|
$this->descr = "";
|
|
$this->trace = 0;
|
|
$this->outside = 0;
|
|
$this->mod_allow = 1;
|
|
$this->start = new DateTime();
|
|
$this->end = new DateTime();
|
|
$this->t_ignore = 0;
|
|
$this->visitor = -1;
|
|
#$this->product = new product($this->dbconn);
|
|
$this->remember = 0;
|
|
$this->remembered = 0;
|
|
$this->email = 0;
|
|
$this->participant = array();
|
|
$this->participant_state = array();
|
|
|
|
$this->subject = "";
|
|
$this->account_name = "";
|
|
$this->account_id = "";
|
|
$this->contact_name = "";
|
|
|
|
$this->init_custom("appointment1");
|
|
|
|
# Repeat stuff
|
|
$this->repeat = APP_NOREP;
|
|
$this->r_arg = 0;
|
|
$this->r_ignore = 0;
|
|
|
|
$this->participants_is_read = false;
|
|
$this->res = array();
|
|
$this->tablename = $this->dbconn->prefix .$table['appointment1'][name];
|
|
}
|
|
|
|
/**
|
|
* fill the object data with a given resultset
|
|
*
|
|
* @param Object $r a result set object
|
|
* @param int $pos a index in the resultset
|
|
*/
|
|
|
|
function getUserName($userid)
|
|
{
|
|
//require_once("modules/Users/User.php");
|
|
$user = new User();
|
|
$user->retrieve($userid);
|
|
return $user->first_name." ".$user->last_name;
|
|
}
|
|
|
|
function getContactName($contactid)
|
|
{
|
|
require_once("modules/Contacts/Contact.php");
|
|
$contact = new Contact();
|
|
$contact->retrieve($contactid);
|
|
return $contact->first_name." ".$contact->last_name;
|
|
}
|
|
|
|
// srini read_result
|
|
function read_result ($val_array, $pos=-1) {
|
|
// print("<br>GS --> read_result pos=".$pos);
|
|
// print_r($val_array);
|
|
if($pos!=-1) return;
|
|
//print("GS --> continuing");
|
|
$fmt_sthr='';
|
|
$fmt_stm='';
|
|
list($sthr,$stmn,$stsc) = split(":",$val_array["time_start"]);
|
|
if($sthr <= 9 && strlen(trim($sthr)) < 2)
|
|
{
|
|
$fmt_sthr= '0'.$sthr;
|
|
}
|
|
else
|
|
{
|
|
$fmt_sthr= $sthr;
|
|
}
|
|
if($stmn <= 9 && strlen(trim($stmn)) < 2)
|
|
{
|
|
$fmt_stm= '0'.$stmn;
|
|
}
|
|
else
|
|
{
|
|
$fmt_stm = $stmn;
|
|
}
|
|
$startdate = $val_array["date_start"] .' ' . $fmt_sthr .":" . $fmt_stm .":00";
|
|
|
|
//end time calculation
|
|
$endhr = 0;
|
|
$endmin = $stmn + $val_array["duration_minutes"];
|
|
if($endmin <= 9) $endmin= '0'.$endmin;
|
|
if($endmin >= 60)
|
|
{
|
|
$endmin = $endmin%60;
|
|
if($endmin <= 9) $endmin= '0'.$endmin;
|
|
$endhr++;
|
|
}
|
|
$endhr = $endhr + $sthr + $val_array["duration_hours"];
|
|
if($endhr <= 9) $endhr= '0'.$endhr;
|
|
if ($endhr > 23) $endhr = 23;
|
|
$enddate = $val_array["date_start"] .' ' . $endhr .":" . $endmin .":00";
|
|
//
|
|
$this->t_ignore = $val_array["t_ignore"];
|
|
$this->descr = $val_array["subject"];
|
|
$this->start = new DateTime($startdate);
|
|
// For getting the account name by Fredy
|
|
$this->account_name = $val_array["accountname"]; // fk
|
|
$this->account_id = $val_array["accountid"]; // fk
|
|
$this->eventstatus = $val_array["eventstatus"]; // fk
|
|
// For getting the account name by Fredy
|
|
$this->end = new DateTime($enddate);
|
|
$this->subject = $val_array["subject"];
|
|
$this->module_name = $val_array["activitytype"];
|
|
$this->record_id = $val_array["activityid"];
|
|
#$this->creator = getObject($this->dbconn,$r->get($pos, "creator"));
|
|
$obj->creator->id = $val_array["smownerid"];
|
|
#$this->creator = $val_array["creator"];
|
|
$this->creator = getUserName($val_array["smownerid"]);
|
|
//print("GS -> subject=".$this->subject);
|
|
|
|
$this->outside = $val_array["location"];
|
|
|
|
# Checks
|
|
if ( $this->remembered == "" ) {
|
|
$this->remembered = 0;
|
|
}
|
|
if ( ($this->repeat == "") || ( $this->repeat > 4 ) ) {
|
|
$this->repeat = APP_NOREP;
|
|
}
|
|
# This should work with different timezones ????
|
|
# but we do not exactly know what date !!
|
|
$x1 = new DateTime();
|
|
$x2 = new DateTime();
|
|
$x1->setDateTimeTS($this->start->ts_def);
|
|
$x2->setDateTimeTS($this->end->ts_def);
|
|
if ( $this->t_ignore == "0" ) {
|
|
if ( ( $x1->hour == $x2->hour )
|
|
&& ( $x1->min == $x2->min )
|
|
&& ( $x1->min == "00" )
|
|
&& ( $x1->hour == "00" )
|
|
) {
|
|
$this->t_ignore = 1;
|
|
} else {
|
|
$this->t_ignore = 0;
|
|
}
|
|
}
|
|
/*$this->read_custom_result($r,$pos,"appointment1");
|
|
parent::read_result($r,$pos);
|
|
$this->read_participants();*/
|
|
parent::read_result($val_array);
|
|
//print_r($val_array);
|
|
return;
|
|
}
|
|
/**
|
|
* read a list of the participants of this app
|
|
*/
|
|
function read_participants () {
|
|
if ( empty($this->id) ) return;
|
|
if ( -1 == $this->id ) return;
|
|
|
|
if ( $this->participants_is_read ) {
|
|
return;
|
|
};
|
|
/* Get the list of participants */
|
|
$query = "SELECT * FROM ". $this->tablename2 ." WHERE app_id = ". $this->id;
|
|
$result = $this->dbconn->Exec($query);
|
|
|
|
$n = $result->numrows();
|
|
$a = 0;
|
|
while ($a < $n) {
|
|
$xx = $result->get($a, "adr_id");
|
|
$p = getObject($this->dbconn,$xx);
|
|
|
|
$this->participant[$xx] = &$p;
|
|
$this->participant_state[$xx] = $result->get($a, "state");
|
|
|
|
$a++;
|
|
unset($p);
|
|
}
|
|
$result->free();
|
|
$this->participants_is_read = true;
|
|
}
|
|
/**
|
|
* fill the internal neighbour list with possible objects where a object
|
|
* currently attached/referencing to THIS could be reattached
|
|
*/
|
|
function getNeighbours () {
|
|
global $lang;
|
|
|
|
if (count ($this->neighbours) > 0 ) return;
|
|
|
|
parent::getNeighbours();
|
|
|
|
if ( $this->visitor != -1 ) {
|
|
$this->neighbours[$this->visitor->id] = &$this->visitor;
|
|
}
|
|
if ( $this->product != -1 ) {
|
|
$this->neighbours[$this->product->id] = &$this->product;
|
|
}
|
|
|
|
return $this->neighbours;
|
|
}
|
|
/**
|
|
* delete the appointment in the database
|
|
*/
|
|
function delete() {
|
|
global $current_user;
|
|
|
|
$msg = "";
|
|
|
|
$q = "DELETE FROM ". $this->tablename ." WHERE id = ". $this->id;
|
|
$this->dbconn->Exec($q);
|
|
|
|
$q = "DELETE FROM ". $this->tablename2 ." WHERE app_id = ". $this->id;
|
|
$this->dbconn->Exec($q);
|
|
|
|
$msg .= parent::delete();
|
|
return $msg;
|
|
}
|
|
/**
|
|
* Replaces the strings in the mail body
|
|
*/
|
|
function make_mail_body(&$body,&$to) {
|
|
global $lang;
|
|
|
|
|
|
$url = getBaseURL(true). $this->getURL();
|
|
|
|
$body = eregi_replace("@CREATOR@",$this->creator->getFullName(),$body);
|
|
$body = eregi_replace("@DESC@",$this->descr,$body);
|
|
$body = eregi_replace("@URL@",$url,$body);
|
|
|
|
if ( $to->gettype() == "team" ) {
|
|
$body = eregi_replace("@TO@",$lang[$to->gettype()] ." ". $to->getFullName(),$body);
|
|
$body = eregi_replace("<TEAM>","",$body);
|
|
$body = eregi_replace("</TEAM>","",$body);
|
|
} else {
|
|
$body = eregi_replace("@TO@",$to->getFullName(),$body);
|
|
# Remove the TEAM part
|
|
$body = eregi_replace("<TEAM>.*</TEAM>","",$body);
|
|
}
|
|
|
|
if ( $this->t_ignore == 0) {
|
|
$body = eregi_replace("@START@",$this->start->getDateTime(),$body);
|
|
$body = eregi_replace("@END@",$this->end->getDateTime(),$body);
|
|
} else {
|
|
$body = eregi_replace("@START@",$this->start->getDate(),$body);
|
|
$body = eregi_replace("@END@",$this->end->getDate(),$body);
|
|
}
|
|
|
|
if ( ($this->trace == 1) && ($to->gettype() != "team") ) {
|
|
$urlv = getBaseURL(true) ."app_vote.php?id=". $this->id ."&adr_id=".$to->id;
|
|
|
|
$body = eregi_replace("@URLV@",$urlv,$body);
|
|
$body = eregi_replace("<VOTE>","",$body);
|
|
$body = eregi_replace("</VOTE>","",$body);
|
|
} else {
|
|
# Remove the VOTE part
|
|
$body = eregi_replace("<VOTE>.*</VOTE>","",$body);
|
|
}
|
|
}
|
|
/**
|
|
* set the start time
|
|
*/
|
|
function setStartTime(&$value) {
|
|
return $this->setDateTimeField("start",$value,"StartTime");
|
|
}
|
|
/**
|
|
* set the end time
|
|
*/
|
|
function setEndTime(&$value) {
|
|
return $this->setDateTimeField("end",$value,"EndTime");
|
|
}
|
|
/**
|
|
* set the description
|
|
*/
|
|
function setDescription($value) {
|
|
return $this->setStrField("descr",$value,"Description");
|
|
}
|
|
/**
|
|
* set the location
|
|
*/
|
|
function setLocation($value) {
|
|
return $this->setIntField("outside",$value,"Location2");
|
|
}
|
|
/**
|
|
* set the trace status
|
|
*/
|
|
function setTrace($value) {
|
|
return $this->setIntField("trace",$value,"tracestate");
|
|
}
|
|
/**
|
|
* set the reminder
|
|
*/
|
|
function setRemember($value) {
|
|
$this->setIntField("remember",$value,"AppEmailRemind");
|
|
$this->remembered = 0;
|
|
}
|
|
/**
|
|
* set the Product
|
|
*/
|
|
function setProduct($new) {
|
|
if ( $new == -1 ) {
|
|
$id = -1;
|
|
} else {
|
|
$id = $new->id;
|
|
}
|
|
if ( (($this->product != -1) && ($this->product->id != $id) )
|
|
|| (($this->product == -1) && ($id != -1) ) ) {
|
|
$this->modified[] = array ( "field" => "ProductP" , "old" => $this->product->id , "new" => $id );
|
|
$this->product = $new;
|
|
}
|
|
return;
|
|
}
|
|
/**
|
|
* set the Visitor
|
|
*/
|
|
function setVisitor($new) {
|
|
if ( $new == -1 ) {
|
|
$id = -1;
|
|
} else {
|
|
$id = $new->id;
|
|
}
|
|
if ( (($this->visitor != -1) && ($this->visitor->id != $id) )
|
|
|| (($this->visitor == -1) && ($id != -1) ) ) {
|
|
$this->modified[] = array ( "field" => "VisitAt" , "old" => $this->visitor->id , "new" => $id );
|
|
$this->visitor = $new;
|
|
}
|
|
return;
|
|
}
|
|
/**
|
|
* add a participant
|
|
*/
|
|
function addParticipant(&$obj) {
|
|
if (!isset($this->participant[$obj->id])) {
|
|
$this->participant[$obj->id] = &$obj;
|
|
$this->participant_state[$obj->id] = APP_STATE_UNKNOWN;
|
|
$this->modified[] = array ( "field" => "Participant" , "old" => 0 , "new" => $obj->id );
|
|
}
|
|
return;
|
|
}
|
|
/**
|
|
* delete a participant
|
|
*/
|
|
function delParticipant($id) {
|
|
if (isset($this->participant[$id])) {
|
|
unset($this->participant[$id]);
|
|
unset($this->participant_state[$id]);
|
|
$this->modified[] = array ( "field" => "Participant" , "old" => $id , "new" => 0 );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* save the object to the database and sent mails if neccessary
|
|
*/
|
|
function save() {
|
|
global $table,$lang , $current_user, $tutos;
|
|
|
|
$q = new query($this->dbconn);
|
|
$q->setTable($this->tablename);
|
|
$q->addFV("a_start",$this->start,"DATETIME");
|
|
$q->addFV("a_end",$this->end,"DATETIME");
|
|
$q->addFV("description",$this->descr,"STRING",$table['appointment1']['description'][size]);
|
|
$q->addFV("t_ignore",$this->t_ignore,"INT");
|
|
$q->addFV("outside",$this->outside,"INT");
|
|
$q->addFV("r_arg",$this->r_arg,"STRING",5);
|
|
$q->addFV("r_ignore",$this->r_ignore,"INT");
|
|
$q->addFV("trace",$this->trace,"INT");
|
|
$q->addFV("remember",$this->remember,"INT");
|
|
$q->addFV("remembered",$this->remembered,"");
|
|
$q->addFV("mod_allow",$this->mod_allow,"");
|
|
$q->addFV("repeat",$this->repeat,"INT");
|
|
if ( is_object($this->visitor) && ($this->visitor->id != -1) ) {
|
|
$q->addFV("visitor",$this->visitor,"OBJ");
|
|
} else {
|
|
$q->addFV("visitor","null","");
|
|
}
|
|
|
|
if ( is_object($this->product) && ( $this->product->id != -1) ) {
|
|
$q->addFV("product",$this->product,"OBJ");
|
|
} else {
|
|
$q->addFV("product","null","");
|
|
}
|
|
$this->save_custom_fields($q);
|
|
|
|
$msg = "";
|
|
if ( $this->trace == 0 ) {
|
|
/* YES */
|
|
$def_state = 1;
|
|
} else {
|
|
/* UNDECIDED */
|
|
$def_state = 0;
|
|
}
|
|
|
|
if ( $this->id > -1 ) {
|
|
/* We have to modify an existing appointment */
|
|
$new = 0;
|
|
|
|
$q->addWC("id",$this->id,"");
|
|
|
|
$this->dbconn->Exec($q->getUpdate());
|
|
|
|
/* Remove the old list of participants */
|
|
$q = "DELETE FROM ". $this->tablename2 ." WHERE app_id = ". $this->id;
|
|
$this->dbconn->Exec($q);
|
|
|
|
} else {
|
|
$new = 1;
|
|
$this->modified = array();
|
|
if ( isset($this->newid) ) {
|
|
$this->id = $this->newid;
|
|
$q->addFV("id",$this->id,"");
|
|
} else {
|
|
/* Get an new appointment ID */
|
|
$this->id = $q->addFV("id",-1,"NEXTID");
|
|
|
|
$this->modified[] = array ( "field" => "created" ,
|
|
"old" => $this->getType() ,
|
|
"new" => $this->id,
|
|
"obj_id" => $this->id
|
|
);
|
|
}
|
|
$q->addFV("creator",$this->creator,"OBJ");
|
|
$q->addFV("creation",$this->creation,"DATETIME");
|
|
|
|
$this->dbconn->Exec($q->getInsert());
|
|
|
|
//Add appointment to CRM Calendar
|
|
$stmt = "SELECT max(id) as max_id FROM ". $this->dbconn->prefix .$table['appointment1'][name];
|
|
|
|
$rset = $this->dbconn->Exec($stmt);
|
|
$nrow = $rset->numrows();
|
|
$j = 0;
|
|
if($j < $nrow)
|
|
{
|
|
$cat = $rset->get($j, "max_id");
|
|
}
|
|
$this->calid = $cat;
|
|
$cq = new query($this->dbconn);
|
|
$cq->setTable($this->crm_calinfo);
|
|
$cq->addFV("id",$this->calid,"INT");
|
|
$cq->addFV("subject",$this->subject,"STRING",$table['crmcalendar']['subject'][size]);
|
|
$cq->addFV("account_name",$this->account_name,"STRING",$table['crmcalendar']['account_name'][size]);
|
|
$cq->addFV("contact_name",$this->contact_name,"STRING",$table['crmcalendar']['contact_name'][size]);
|
|
|
|
$this->dbconn->Exec($cq->getInsert());
|
|
//
|
|
|
|
|
|
}
|
|
|
|
# Manage the permissions
|
|
$this->acl = array();
|
|
if ( $this->mod_allow == CAL_MODPRIV ) {
|
|
acl_raise($this,$this->creator->id,$tutos[delok]);
|
|
foreach($this->participant as $i => $f) {
|
|
acl_raise($this,$i,$tutos[delok]);
|
|
}
|
|
} else if ( $this->mod_allow == CAL_MODUSER ) {
|
|
acl_default($this,$current_user);
|
|
acl_raise($this,$current_user->id,$tutos[delok]);
|
|
} else if ( $this->mod_allow == CAL_MODPART ) {
|
|
acl_default($this,$current_user);
|
|
foreach($this->participant as $i => $f) {
|
|
acl_raise($this,$i,$tutos[delok]);
|
|
}
|
|
} else if ( $this->mod_allow == CAL_MODALL ) {
|
|
acl_default($this,$current_user);
|
|
foreach($this->participant as $i => $f) {
|
|
acl_raise($this,$i,$tutos[delok]);
|
|
}
|
|
acl_raise($this,0,$tutos[delok]);
|
|
}
|
|
# Participants can (at least) SEE
|
|
foreach($this->participant as $i => $f) {
|
|
acl_raise($this,$i,$tutos[seeok]);
|
|
}
|
|
|
|
|
|
/* Now we add all references to the participants */
|
|
/* The creator always says yes to the appointment */
|
|
foreach($this->participant as $i => $f) {
|
|
$state = $def_state;
|
|
if ( (count($this->modified) == 0) && isset($this->participant_state[$i])) {
|
|
$state = $this->participant_state[$i];
|
|
} else if ( $i == $this->creator->id ) {
|
|
/* The creator says yes */
|
|
$state = APP_STATE_YES;
|
|
}
|
|
$flds = "app_id";
|
|
$vals = $this->id;
|
|
|
|
$flds .= ",adr_id";
|
|
$vals .= ",".$i;
|
|
|
|
$flds .= ",state";
|
|
$vals .= ",".$state;
|
|
|
|
$q = "INSERT INTO ". $this->tablename2 ." (". $flds .") VALUES (". $vals .")";
|
|
$this->dbconn->Exec($q);
|
|
|
|
$this->participant_state[$i] = $state;
|
|
}
|
|
$msg .= parent::save();
|
|
|
|
|
|
# Mail things come here !
|
|
|
|
if ( $this->email == 1 ) {
|
|
$m = new mail($current_user);
|
|
$m->setFrom($this->creator);
|
|
|
|
$pl = $this->participant;
|
|
|
|
@reset($pl);
|
|
while ( list ($i,$f) = @each ($pl) ) {
|
|
$m->addTo($pl[$i]);
|
|
$body = "";
|
|
|
|
if ( ! findMailTemplate("app_new.proto",$f,$body) ) {
|
|
$msg .= sprintf($lang['Err0037'],$m->subject,$body) ."<br />\n";
|
|
continue;
|
|
}
|
|
|
|
$m->setSubject($f->lg['Invitation']);
|
|
$this->make_mail_body($body,$f);
|
|
|
|
$m->addBody($body,"text/plain",$f->lg['NewAppoint'],"",$f->lg['content_encoding']);
|
|
if ( $tutos[useical] == 1 ) {
|
|
$m->addBody($this->getIcal(),"text/calendar; method=REQUEST; name=ICalEntry.ics","ICalEntry.vcs","attachment; filename=ICalEntry.vcs");
|
|
}
|
|
if ( $current_user->feature_ok(usevcard,PERM_SEE) ) {
|
|
$m->addBody($this->creator->getVcard(),"text/x-vcard",sprintf($lang['MailCard'], $this->creator->getFullName()),"attachment; filename=\"". $this->creator->l_name .".vcf\"" );
|
|
}
|
|
|
|
$msg .= $m->send();
|
|
$m->resetBody();
|
|
$m->resetTo();
|
|
}
|
|
}
|
|
|
|
|
|
return $msg;
|
|
}
|
|
/**
|
|
* save the voting for an object
|
|
*/
|
|
function save_vote($vote,$adr_id) {
|
|
global $lang , $current_user, $tutos;
|
|
$msg = "";
|
|
$q = "UPDATE ". $this->tablename2 ." SET state = ". $vote ." WHERE app_id = ". $this->id ." AND adr_id = ". $adr_id;
|
|
$this->dbconn->Exec($q);
|
|
$this->modified[] = array ( "field" => "AppointCommit" ,
|
|
"old" => $this->participant_state[$adr_id] ,
|
|
"new" => $vote,
|
|
"obj_id" => $this->id
|
|
);
|
|
$msg .= history_save($this);
|
|
return $msg;
|
|
}
|
|
/**
|
|
* Return a URL to this appointment
|
|
*/
|
|
function getURL() {
|
|
global $callink;
|
|
return $callink ."app_show&id=" . $this->id;
|
|
}
|
|
/**
|
|
* Return a URL to delete this appointment
|
|
*/
|
|
function getDelURL() {
|
|
global $callink;
|
|
return $callink ."app_del&id=" . $this->id;
|
|
}
|
|
/**
|
|
* Return a URL to delete this appointment
|
|
*/
|
|
function getModURL() {
|
|
global $callink;
|
|
if ( $this->repeat == APP_NOREP ) {
|
|
return $callink ."app_new&id=" . $this->id;
|
|
} else {
|
|
return $callink ."app_new_r&id=" . $this->id;
|
|
}
|
|
}
|
|
/**
|
|
* Return a link to this appointment
|
|
*/
|
|
function getFullName() {
|
|
$ts = $this->getTimespan();
|
|
return sprintf ("%s %s",$this->descr,$ts['desc']);
|
|
}
|
|
/**
|
|
* Return a link to this appointment
|
|
*/
|
|
function getLink($text = -1) {
|
|
global $lang,$mod_strings;
|
|
|
|
// commented temporary srini
|
|
/*if ( ($this->mod_ok()) && ($this->end->getTimestamp() - time() > 0 ) ) {*/
|
|
// commented and added by raj
|
|
#$url = $this->getModURL();
|
|
// $url = "../../index.php?module=Activities&action=DetailView&actvity_mode=Events&record=".$this->record_id;
|
|
$url = "index.php?action=DetailView&module=Activities&record=".$this->record_id ."&activity_mode=Events";
|
|
|
|
//
|
|
$info = $mod_strings['LBL_CHANGE_APPNT'];
|
|
/*} else {
|
|
$url = $this->getURL();
|
|
$info = $lang['seeapp'];
|
|
}*/
|
|
if ( $this->repeat == APP_NOREP ) {
|
|
if ( $this->t_ignore == 0) {
|
|
$info = sprintf ($info,$this->start->getDateTimeShort(),$this->end->getDateTimeShort());
|
|
} else {
|
|
$info = sprintf ($info,$this->start->getDate(),$this->end->getDate());
|
|
}
|
|
} else {
|
|
if ($this->r_ignore == 1) {
|
|
if ( $this->t_ignore == 0) {
|
|
$info = sprintf ($info,$this->start->getDateTimeShort(),$lang['AppNoLastDate']);
|
|
} else {
|
|
$info = sprintf ($info,$this->start->getDate(),$lang['AppNoLastDate']);
|
|
}
|
|
} else {
|
|
if ( $this->t_ignore == 0) {
|
|
$info = sprintf ($info,$this->start->getDateTimeShort(),$this->end->getDateTimeShort());
|
|
} else {
|
|
$info = sprintf ($info,$this->start->getDate(),$this->end->getDate());
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( $text != -1 ) {
|
|
if ( $this->see_ok() ) {
|
|
return makelink($url,$text,$info);
|
|
} else {
|
|
return myentities($text);
|
|
}
|
|
}
|
|
if ( $this->see_ok() ) {
|
|
if ( $this->repeat == APP_NOREP ) {
|
|
return makelink($url , $this->start->GetDate() ,$info) . " " . $this->descr;
|
|
} else {
|
|
return makelink($url , "�". $this->start->GetDate() ,$info) . " " . $this->descr;
|
|
}
|
|
} else {
|
|
if ( $this->repeat == APP_NOREP ) {
|
|
return myentities($this->start->GetDate());
|
|
} else {
|
|
return myentities("�". $this->start->GetDate());
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Data of XML export
|
|
*/
|
|
function exportXML_body ($only_ids = false) {
|
|
global $lang, $current_user;
|
|
$r = parent::exportXML_body();
|
|
if (!$only_ids) {
|
|
$r .= "<description>". utf8_encode(htmlspecialchars($this->descr)) ."</description>\n";
|
|
if ( $this->start->notime != 1 ) {
|
|
$r .= "<start>". $this->start->exportXML_body() ."</start>\n";
|
|
}
|
|
if ( $this->end->notime != 1 ) {
|
|
$r .= "<end>". $this->end->exportXML_body() ."</end>\n";
|
|
}
|
|
$r .= "<t_ignore>". utf8_encode(htmlspecialchars($this->t_ignore)) ."</t_ignore>\n";
|
|
$r .= "<remember>". utf8_encode(htmlspecialchars($this->remember)) ."</remember>\n";
|
|
$r .= "<remembered>". utf8_encode(htmlspecialchars($this->remembered)) ."</remembered>\n";
|
|
$r .= "<visitor>". utf8_encode(htmlspecialchars($this->visitor->id)) ."</visitor>\n";
|
|
if ( $this->visitor->id != null ) {
|
|
$r .= "<visitorname>". utf8_encode(htmlspecialchars($this->visitor->getFullName())) ."</visitorname>\n";
|
|
}
|
|
$r .= "<repeat>". utf8_encode(htmlspecialchars($this->repeat)) ."</repeat>\n";
|
|
$r .= "<r_arg>". utf8_encode(htmlspecialchars($this->r_arg)) ."</r_arg>\n";
|
|
$r .= "<r_ignore>". utf8_encode(htmlspecialchars($this->r_ignore)) ."</r_ignore>\n";
|
|
$r .= "<outside>".$this->outside."</outside>";
|
|
$r .= "<apploc>".utf8_encode(htmlspecialchars($lang['AppLoc'][$this->outside]))."</apploc>";
|
|
}
|
|
unset($self_id);
|
|
foreach ($this->participant as $i => $f) {
|
|
if ($f->gettype() == "team") {
|
|
$f->read_member();
|
|
if ($f->is_member($current_user) == 1) {
|
|
$self_id = $current_user->id;
|
|
}
|
|
} else {
|
|
if ($f->id == $current_user->id) {
|
|
$self_id = $current_user->id;
|
|
}
|
|
}
|
|
$r .= "<participant>\n";
|
|
$r .= "<id>".$f->id."</id>\n";
|
|
$r .= "<fullname>". utf8_encode(htmlspecialchars($f->getFullName())) ."</fullname>\n";
|
|
$r .= "</participant>\n";
|
|
}
|
|
$r .= "<self>".$self_id."</self>\n";
|
|
return $r;
|
|
}
|
|
/**
|
|
* parse XML import
|
|
*/
|
|
function parseXML ($fld,$data,$attrs) {
|
|
parent::parseXML($fld,$data,$attrs);
|
|
if ($fld == "description") {
|
|
$this->setDescription($data);
|
|
} else if ($fld == "start") {
|
|
$d = new DateTime($data);
|
|
$this->setStartTime($d);
|
|
} else if ($fld == "end") {
|
|
$d = new DateTime($data);
|
|
$this->setEndTime($d);
|
|
# } else if ($fld == "participant") {
|
|
# $this->setLName($data);
|
|
} else if ($fld == "t_ignore") {
|
|
$this->t_ignore = $data;
|
|
} else if ($fld == "r_ignore") {
|
|
$this->r_ignore = $data;
|
|
} else if ($fld == "repeat") {
|
|
$this->repeat = $data;
|
|
} else if ($fld == "r_arg") {
|
|
$this->r_arg = $data;
|
|
} else if ($fld == "remember") {
|
|
$this->remember = $data;
|
|
}else if ($fld == "remembered") {
|
|
$this->remembered = $data;
|
|
}
|
|
return;
|
|
}
|
|
/**
|
|
* Return a ical description of this appointment as described in rfc2445
|
|
* see http://www.imc.org/rfc2445
|
|
*/
|
|
function getIcal() {
|
|
global $lang;
|
|
|
|
if ( $this->trace == 1 ) {
|
|
$rsvp = "TRUE";
|
|
} else {
|
|
$rsvp = "FALSE";
|
|
}
|
|
$url = getBaseURL(true) . $this->getURL();
|
|
$ical = "";
|
|
$ical .= "BEGIN:VCALENDAR\n";
|
|
$ical .= "METHOD:REQUEST\n";
|
|
$ical .= "VERSION:2.0\n";
|
|
$ical .= "PRODID:-//hacksw/handcal//NONSGML v1.0//EN\n";
|
|
$ical .= "BEGIN:VEVENT\n";
|
|
$ical .= "UID\n :TUTOS_ID-". $this->id ."\n";
|
|
$ical .= "DTSTART\n";
|
|
if ( $this->t_ignore ) {
|
|
$ical .= " ;VALUE=DATE\n";
|
|
$ical .= " :". $this->start->getYYYYMMDD() ."\n";
|
|
} else {
|
|
$ical .= " :". $this->start->getIcal() ."\n";
|
|
}
|
|
$ical .= "DTEND\n";
|
|
if ( $this->repeat != APP_NOREP ) {
|
|
if ( $this->t_ignore ) {
|
|
$ical .= " ;VALUE=DATE\n";
|
|
$ical .= " :". $this->start->getYYYYMMDD() ."\n";
|
|
} else {
|
|
$ical .= " :". $this->start->getIcal() ."\n";
|
|
}
|
|
} else if ( $this->t_ignore ) {
|
|
$ical .= " ;VALUE=DATE\n";
|
|
$ical .= " :". $this->end->getYYYYMMDD() ."\n";
|
|
} else {
|
|
$ical .= " :". $this->end->getIcal() ."\n";
|
|
}
|
|
|
|
$dtstamp = new DateTime();
|
|
$ical .= "DTSTAMP\n :". $dtstamp->getIcal() ."\n";
|
|
@reset($this->participant);
|
|
while ( list ($i,$f) = @each ($this->participant) ) {
|
|
if ( $i == $this->creator->id ) {
|
|
$ical .= "ORGANIZER\n :MAILTO:". $f->default_email() ."\n";
|
|
}
|
|
}
|
|
|
|
$ical .= "STATUS\n :". "TENTATIVE" ."\n";
|
|
$ical .= "DESCRIPTION\n :". utf8_encode(ereg_replace("\r*\n","\\n",$this->descr)) ."\n";
|
|
$ical .= "SUMMARY\n :". utf8_encode(ereg_replace("\r*\n","\\n", $this->descr)) ."\n";
|
|
$ical .= "LOCATION\n :". utf8_encode($lang['AppLoc'][$this->outside]) ."\n";
|
|
$ical .= "CREATED\n :". $this->creation->getIcal() ."\n";
|
|
@reset($this->participant);
|
|
$p = array();
|
|
while ( list ($i,$f) = @each ($this->participant) ) {
|
|
if ( isset($p[$f->id]) ) {
|
|
continue;
|
|
}
|
|
if ( $i == $this->creator->id ) {
|
|
$ical .= "ATTENDEE\n ;CN=\"". utf8_encode($f->getFullName()) ."\"\n ;RSVP=". $rsvp ."\n ;ROLE=CHAIR";
|
|
if ( ($this->trace == 1) && ($this->participant_state[$i] == 0) ) {
|
|
$ical .= "\n ;PARTSTAT=NEEDS-ACTION";
|
|
} else if ( ($this->trace == 1) && ($this->participant_state[$i] == 2) ) {
|
|
$ical .= "\n ;PARTSTAT=DECLINED";
|
|
} else {
|
|
$ical .= "\n ;PARTSTAT=ACCEPTED";
|
|
}
|
|
$ical .= "\n :MAILTO:". utf8_encode($f->getFullName()) ." <". $f->default_Email() .">";
|
|
$ical .= "\n";
|
|
$p[$f->id] = 1;
|
|
} else if ( ($f->gettype() == "address") || ($f->gettype() == "user") ) {
|
|
$ical .= "ATTENDEE\n ;CN=\"". utf8_encode($f->getFullName()) ."\"\n ;RSVP=". $rsvp ."\n ;ROLE=REQ-PARTICIPANT";
|
|
if ( ($this->trace == 1) && ($this->participant_state[$i] == 1) ) {
|
|
$ical .= "\n ;PARTSTAT=ACCEPTED";
|
|
} else if ( ($this->trace == 1) && ($this->participant_state[$i] == 2) ) {
|
|
$ical .= "\n ;PARTSTAT=DECLINED";
|
|
} else {
|
|
$ical .= "\n ;PARTSTAT=NEEDS-ACTION";
|
|
}
|
|
$ical .= "\n :MAILTO:". utf8_encode($f->getFullName()) ." <". $f->default_Email() .">";
|
|
$ical .= "\n";
|
|
$p[$f->id] = 1;
|
|
} else if ( $f->gettype() == "team" ) {
|
|
$f->read_member();
|
|
foreach($f->member as $it => $ft) {
|
|
if ( ! isset($p[$ft->id]) ) {
|
|
$ical .= "ATTENDEE\n ;CN=\"". utf8_encode($ft->getFullName()) ."\"\n ;RSVP=". $rsvp ."\n ;ROLE=REQ-PARTICIPANT\n :MAILTO:". utf8_encode($ft->getFullName()) ." <". $ft->default_email() .">\n";
|
|
$p[$ft->id] = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ( $this->repeat != APP_NOREP ) {
|
|
$wd = array("SU","MO","TU","WE","TH","FR","SA","SU");
|
|
# We currently only know repeat by one events
|
|
# $ical .= "SEQUENCE\n :1\n";
|
|
$ical .= "RRULE\n :";
|
|
if ( $this->repeat == APP_REP_DAY ) {
|
|
$ical .= "FREQ=DAILY;INTERVAL=1";
|
|
} else if ( $this->repeat == APP_REP_YEAR ) {
|
|
$ical .= "FREQ=YEARLY;INTERVAL=1;BYMONTH=". Date("n",$this->start->getTimeStamp()) .";BYMONTHDAY=". Date("j",$this->start->getTimeStamp());
|
|
} else if ( $this->repeat == APP_REP_MONTH ) {
|
|
$ical .= "FREQ=MONTHLY;INTERVAL=1;BYMONTHDAY=".$this->r_arg;
|
|
} else if ( $this->repeat == APP_REP_WEEK ) {
|
|
$ical .= "FREQ=WEEKLY;INTERVAL=1;BYDAY=".$wd[$this->r_arg];
|
|
} else {
|
|
$ical .= "FREQ=DAILY;INTERVAL=0";
|
|
}
|
|
if ( $this->r_ignore == 0 ) {
|
|
$ical .= ";UNTIL=". $this->end->getYYYYMMDD();
|
|
}
|
|
# FIX ME !!
|
|
$ical .= "\n";
|
|
}
|
|
$ical .= "ATTACH;FMTTYPE=text/html:". $url ."\n";
|
|
if ( $this->remember > 0 ) {
|
|
$ical .= "BEGIN:VALARM\n";
|
|
$ical .= "ACTION\n : DISPLAY\n";
|
|
$ical .= "TRIGGER\n ;VALUE=DURATION\n :-PT". $this->remember ."M\n";
|
|
$ical .= "END:VALARM\n";
|
|
}
|
|
$ical .= "END:VEVENT\n";
|
|
$ical .= "END:VCALENDAR\n";
|
|
return $ical;
|
|
}
|
|
|
|
/**
|
|
* return true if the given app overlap with this
|
|
*/
|
|
function overlap(&$app) {
|
|
if ( $this->t_ignore != 0 ) {
|
|
$start = $this->start;
|
|
$end = $this->end;
|
|
$start->setDateTime($this->start->getYYYYMMDD());
|
|
$end->setDateTime($this->end->getYYYYMMDD());
|
|
if ( $start->getDate() == $end->GetDate() ) {
|
|
$end->addDays(1);
|
|
}
|
|
$start_ts1 = $start->getTimestamp();
|
|
$end_ts1 = $end->getTimestamp();
|
|
} else {
|
|
$start_ts1 = $this->start->getTimestamp();
|
|
$end_ts1 = $this->end->getTimestamp();
|
|
}
|
|
if ( $app->t_ignore != 0 ) {
|
|
$start = $app->start;
|
|
$end = $app->end;
|
|
$start->setDateTime($app->start->getYYYYMMDD());
|
|
$end->setDateTime($app->end->getYYYYMMDD());
|
|
# if ( $start->getDate() == $end->GetDate() ) {
|
|
$end->addDays(1);
|
|
# }
|
|
$start_ts2 = $start->getTimestamp();
|
|
$end_ts2 = $end->getTimestamp();
|
|
} else {
|
|
$start_ts2 = $app->start->getTimestamp();
|
|
$end_ts2 = $app->end->getTimestamp();
|
|
}
|
|
|
|
# app before this
|
|
if ($end_ts2 <= $start_ts1 ) return false;
|
|
# this before app
|
|
if ($end_ts1 <= $start_ts2 ) return false;
|
|
|
|
return true;
|
|
}
|
|
/**
|
|
* check the availablility of all participants and resources
|
|
* return true on conflicts
|
|
*/
|
|
function check_participants(&$msg) {
|
|
global $lang;
|
|
|
|
# read the calendar for all participants
|
|
# with the given dates
|
|
$r = false;
|
|
$this->callist = array();
|
|
$start = $this->start;
|
|
$end = $this->end;
|
|
if ($this->t_ignore) {
|
|
$end = $this->start;
|
|
}
|
|
if ( $this->t_ignore != 0 ) {
|
|
$start->setDateTime($this->start->getYYYYMMDD());
|
|
$end->setDateTime($this->end->getYYYYMMDD());
|
|
}
|
|
|
|
|
|
# read the calendar for the relevant days
|
|
$start2 = $start;
|
|
$end2 = $end;
|
|
$this->readCal($this,$start,$end);
|
|
|
|
#$msg .= " ". $start->getDateTime() ." ". $end->getDateTime() ."<br />\n";
|
|
#$msg .= " ". count($this->callist) ."<br />\n";
|
|
|
|
foreach ($this->callist as $i => $f) {
|
|
if ($f->id == $this->id) {
|
|
#self
|
|
continue;
|
|
}
|
|
foreach ($this->participant as $i2 => $f2) {
|
|
$uids = array();
|
|
$uids[$i2] = $this->participant[$i2];
|
|
$chk = cal_check_against_list($f,$uids) ;
|
|
if (! $chk ) {
|
|
continue;
|
|
}
|
|
if ( $this->overlap($f) ) {
|
|
$msg .= sprintf($lang['AppConflict'], $f2->getFullName(),$lang[$f->getType()] ." ".$f->getLink()) ."<br />\n";
|
|
$r = true;
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
if ( class_exists ("resource") ) {
|
|
if ( resource::check_available($this,$start2,$end2) ) {
|
|
$r = true;
|
|
}
|
|
}
|
|
return $r;
|
|
}
|
|
/**
|
|
* Return a Location of Appointment
|
|
*/
|
|
function getLocation() {
|
|
global $lang;
|
|
#return "<span class=\"apploc". $this->outside ."\">". $lang['AppLoc'][$this->outside] ."</span>";
|
|
return "<span>". $this->outside ."</span>";
|
|
}
|
|
/**
|
|
* put aout the formatted appointment
|
|
*/
|
|
function formatted () {
|
|
global $lang,$tutos,$current_user,$theme;
|
|
|
|
$theme_path="themes/".$theme."/";
|
|
$image_path=$theme_path."images/";
|
|
|
|
if ( $this->mod_allow == 3 ) {
|
|
$class = "privapp";
|
|
} else {
|
|
$class = "app".$this->outside;
|
|
}
|
|
//included from Fredy's patch
|
|
if ($this->eventstatus == 'Held') {
|
|
$class = "heldmeeting";
|
|
}
|
|
|
|
if ( $this->repeat != APP_NOREP ) {
|
|
$start = $this->start->getTime();
|
|
$end = $this->end->getTime();
|
|
} else {
|
|
if ( $this->s_out == 1 ) {
|
|
$start = "<<";
|
|
} else {
|
|
$start = $this->start->getTime();
|
|
}
|
|
if ( $this->e_out == 1 ) {
|
|
$end = ">>";
|
|
} else {
|
|
$end = $this->end->getTime();
|
|
}
|
|
}
|
|
if ($start == $end) {
|
|
if ( $this->t_ignore != 0 ) {
|
|
$duration = ">>%s<<";
|
|
} else {
|
|
$duration = "%s ". $start;
|
|
}
|
|
} else {
|
|
if ( $this->t_ignore != 0 ) {
|
|
$duration = "<<%s>>";
|
|
} else {
|
|
$duration = "%s ". $start ." - ". $end;
|
|
}
|
|
}
|
|
if ( $this->repeat != APP_NOREP ) {
|
|
$duration = sprintf($duration,"�");
|
|
} else {
|
|
$duration = sprintf($duration," ");
|
|
}
|
|
|
|
echo " <tr>\n";
|
|
echo " <td nowrap=\"nowrap\" class=\"". $class ."\" colspan=\"3\"><b> ". $this->getLink($duration) ."</b></td>\n";
|
|
|
|
//added from Fredy's patch
|
|
echo " <td class=\"". $class ."\" align=\"right\">". $this->creator ." </td>\n";
|
|
#echo " <td nowrap=\"nowrap\" class=\"". $class ."\" align=\"right\"><b>". $this->getLocation() ."</b></td>\n";
|
|
#echo " <td nowrap=\"nowrap\" class=\"". $class ."\" align=\"right\"><b>". $this->outside ."</b></td>\n";
|
|
echo " </tr>\n";
|
|
|
|
//added account names to the calendar entry given by Fredy
|
|
if ($this->account_id != null) {
|
|
echo " <tr>\n";
|
|
echo " <td class=\"". $class ."\" colspan=\"4\"><b> "."<a href=index.php?module=Accounts&action=DetailView&record="
|
|
.$this->account_id.">".$this->account_name."</a></b></td>\n";
|
|
echo " </tr>\n";
|
|
}
|
|
|
|
|
|
$myself = false;
|
|
foreach ( $this->participant as $i => $fp) {
|
|
$fp = &$this->participant[$i];
|
|
echo " <tr>\n";
|
|
if ( ($this->trace == 1) && ( ($fp->gettype() == "address") || ($fp->gettype() == "user") )) {
|
|
$cols = 3;
|
|
} else {
|
|
$cols = 4;
|
|
}
|
|
if ( ($fp->gettype() == "address") || ($fp->gettype() == "user") ) {
|
|
echo " <td nowrap=\"nowrap\" class=\"". $class ."\" align=\"left\" \" width=\"100%\" colspan=\"". $cols ."\">";
|
|
/* for adresses show link with first + last name */
|
|
echo $fp->getLink( $fp->getShortName());
|
|
if ($fp->id == $current_user->id) {
|
|
$myself = true;
|
|
}
|
|
} else if ( $fp->gettype() == "team" ) {
|
|
echo " <td class=\"". $class ."\" width=\"100%\" colspan=\"". $cols ."\">";
|
|
/* for teams show link name */
|
|
echo $fp->getLink();
|
|
} else {
|
|
echo " <td class=\"". $class ."\" width=\"100%\" colspan=\"". $cols ."\">";
|
|
echo gettype($fp);
|
|
}
|
|
echo "</td>\n";
|
|
if ( ($this->trace == 1) && ( ($fp->gettype() == "address") || ($fp->gettype() == "user") ) ) {
|
|
$s = sprintf("text%d",$this->participant_state[$i]);
|
|
echo " <td class=\"". $class ."\" align=\"right\"><span class=\"". $s ."\">";
|
|
if ( $fp->id == $current_user->id ) {
|
|
echo makelink("app_vote.php?id=". $this->id ."&adr_id=". $fp->id,$lang['AppState'][$this->participant_state[$i]],$lang['AppVoteInfo']);
|
|
} else {
|
|
echo $lang['AppState'][$this->participant_state[$i]];
|
|
}
|
|
echo "</span></td>\n";
|
|
}
|
|
echo " </tr>\n";
|
|
unset($fp);
|
|
}
|
|
|
|
//Added for description
|
|
$descr = eregi_replace("\n","<br />",$this->descr);
|
|
if ($descr != "" ) {
|
|
echo " <tr><td width=\"16\" align=\"right\" valign=\"top\"><img src=\""
|
|
.$image_path."".$this->module_name."s.gif\" border=\"0\"> </td><td class=\""
|
|
. $class ."\" colspan=\"2\">". urlReplace($descr) ." </td></tr>\n";
|
|
//echo " <tr><td class=\"". $class ."\" colspan=\"3\">". $this->creator ." </td></tr>\n";
|
|
|
|
}
|
|
|
|
//
|
|
|
|
if ( ($tutos[applocdesc][$this->outside] == 1)
|
|
|| ( ($myself == true) && ($tutos[applocdesc][$this->outside] == 2))
|
|
) {
|
|
$descr = eregi_replace("\n","<br />",$this->descr);
|
|
if ($descr != "" ) {
|
|
echo " <tr><td class=\"". $class ."\" colspan=\"3\">". urlReplace($descr) ."</td></tr>\n";
|
|
}
|
|
if ( $this->visitor != -1 ) {
|
|
echo " <tr><td class=\"". $class ."\" colspan=\"3\">";
|
|
if ( $this->outside ) {
|
|
echo $lang['VisitAt'] .":";
|
|
} else {
|
|
echo $lang['VisitFrom'] .":";
|
|
}
|
|
echo "<br />". $this->visitor->getLink() ."</td></tr>\n";
|
|
}
|
|
|
|
/*product::small_infolist($current_user,$this,3,$class);
|
|
foreach($tutos[activemodules] as $i => $f) {
|
|
$x = new $tutos[modules][$f][name]($this->dbconn);
|
|
$x->small_infolist($current_user,$this,3,$class);
|
|
}*/
|
|
}
|
|
return;
|
|
}
|
|
/**
|
|
* get the timespan
|
|
*/
|
|
function getTimespan () {
|
|
global $lang;
|
|
|
|
$r = array();
|
|
$r['start'] = 0;
|
|
$r['end'] = 0;
|
|
$r['desc'] = "";
|
|
if ( $this->repeat == APP_NOREP) {
|
|
if ( $this->t_ignore == 0) {
|
|
$r['start'] = $this->start->getYYYYMMDDHHMM();
|
|
$r['end'] = $this->end->getYYYYMMDDHHMM();
|
|
$r['desc'] = sprintf ("%s - %s",$this->start->getDateTimeShort(),$this->end->getDateTimeShort());
|
|
} else {
|
|
$r['start'] = $this->start->getYYYYMMDD()."0000";
|
|
$r['end'] = $this->end->getYYYYMMDD()."2359";
|
|
$r['desc'] = sprintf ("%s - %s",$this->start->getDate(),$this->end->getDate());
|
|
}
|
|
} else {
|
|
if ($this->r_ignore == 1) {
|
|
$r['end'] = -1;
|
|
if ( $this->t_ignore == 0) {
|
|
$r['desc'] = sprintf ("%s - %s",$this->start->getDateTimeShort(),$lang['AppNoLastDate']);
|
|
} else {
|
|
$r['desc'] = sprintf ("%s - %s",$this->start->getDate(),$lang['AppNoLastDate']);
|
|
}
|
|
} else {
|
|
if ( $this->t_ignore == 0) {
|
|
$r['desc'] = sprintf ("%s - %s",$this->start->getDateTimeShort(),$this->end->getDateTimeShort());
|
|
} else {
|
|
$r['desc'] = sprintf ("%s - %s",$this->start->getDate(),$this->end->getDate());
|
|
}
|
|
}
|
|
}
|
|
return $r;
|
|
}
|
|
/**
|
|
* checks if the appointment happens that day
|
|
* Date d true if appointment happens that day
|
|
*/
|
|
function inside (&$o) {
|
|
$o->setDateTime($o->getYYYYMMDD());
|
|
$d = new DateTime(0);
|
|
$d->setDateTimeTS($o->ts_def);
|
|
|
|
$x = $d->getYYYYMMDD();
|
|
if ( $x < $this->start->getYYYYMMDD() ) return false;
|
|
|
|
$this->s_out = 0;
|
|
$this->e_out = 0;
|
|
switch ( $this->repeat ) {
|
|
case APP_NOREP:
|
|
if ( $x > $this->end->getYYYYMMDD() ) return false;
|
|
if ( $this->start->getTimeStamp() < $d->getTimeStamp() ) {
|
|
$this->s_out = 1;
|
|
} else {
|
|
$this->s_out = 0;
|
|
}
|
|
if ( $this->end->getTimeStamp() > ($d->getTimeStamp() + 86400) ) {
|
|
$this->e_out = 1;
|
|
} else {
|
|
$this->e_out = 0;
|
|
}
|
|
break;
|
|
case APP_REP_WEEK:
|
|
if ($this->r_arg != Date("w",$d->getTimeStamp())) return false;
|
|
if ( $this->r_ignore == 0 ) {
|
|
# Check end
|
|
if ( $x > $this->end->getYYYYMMDD() ) return false;
|
|
}
|
|
break;
|
|
case APP_REP_MONTH:
|
|
if ($this->r_arg != Date("j",$d->getTimeStamp())) return false;
|
|
if ( $this->r_ignore == 0 ) {
|
|
# Check end
|
|
if ( $x > $this->end->getYYYYMMDD() ) return false;
|
|
}
|
|
break;
|
|
case APP_REP_YEAR:
|
|
if ($this->r_arg != Date("j/n",$d->getTimeStamp())) return false;
|
|
if ( $this->r_ignore == 0 ) {
|
|
# Check end
|
|
if ( $x > $this->end->getYYYYMMDD() ) return false;
|
|
}
|
|
break;
|
|
case APP_REP_DAY:
|
|
if ( $this->r_ignore == 0 ) {
|
|
# Check end
|
|
if ( $x > $this->end->getYYYYMMDD() ) return false;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
/**
|
|
* Transfer reference ids according to given table
|
|
*/
|
|
function transfer_ids (&$trans) {
|
|
parent::transfer_ids ($trans);
|
|
|
|
if ( $this->visitor->id != -1 ) {
|
|
if (isset($trans[$this->visitor->id])) {
|
|
$this->visitor->id = $trans[$this->visitor->id];
|
|
}
|
|
}
|
|
if ( $this->product->id != -1 ) {
|
|
if (isset($trans[$this->product->id])) {
|
|
$this->product->id = $trans[$this->product->id];
|
|
}
|
|
}
|
|
if (isset($trans[$this->creator->id])) {
|
|
$this->creator->id = $trans[$this->creator->id];
|
|
}
|
|
return;
|
|
}
|
|
/**
|
|
* get the type of object
|
|
*/
|
|
function gettype () {
|
|
return "appointment";
|
|
}
|
|
/**
|
|
* get the type id of object
|
|
*/
|
|
function gettypeid () {
|
|
return usecalendar;
|
|
}
|
|
/**
|
|
* get the type id of object
|
|
*/
|
|
function getHtmlIcon () {
|
|
return "appointments";
|
|
}
|
|
/* ---------------------------------------------------------------------------
|
|
* The following methods are abstract factory functions for groups
|
|
* which handle the membership list of an object
|
|
* --------------------------------------------------------------------------- */
|
|
/**
|
|
* create a link where a appointment for the given object could be added
|
|
* obj is ignored here
|
|
*/
|
|
function getaddlink (&$user,&$obj,$text = "") {
|
|
global $lang;
|
|
if ( $obj == -1 ) return "";
|
|
if (! is_object($obj) ) return "";
|
|
if ( $obj->id == -1 ) return "";
|
|
#if (! $user->feature_ok(usecalendar,PERM_NEW) ) return "";
|
|
|
|
$x[0] = array( url => "app_new.php",
|
|
text => $lang['NewEntry'],
|
|
info => $lang['NewAppointInfo'],
|
|
category => array("app","new","obj")
|
|
);
|
|
/* if ( ($obj->getType() == "company") ||
|
|
($obj->getType() == "department")
|
|
) {
|
|
$x[0][url] = addUrlParameter($x[0][url],"vid=".$obj->id);
|
|
$x[0][category] = array("app","new","module");
|
|
$x[0][text] = $lang['NewAppoint'];
|
|
} else if ( ($obj->getType() == "product") ) {
|
|
$x[0][url] = addUrlParameter($x[0][url],"pid=".$obj->id);
|
|
$x[0][category] = array("app","new","module");
|
|
$x[0][text] = $lang['NewAppoint'];
|
|
} else {
|
|
$x[1] = array( url => "app_new_r.php",
|
|
text => $lang['NewAppointR'],
|
|
info => $lang['NewAppointInfoR'],
|
|
category => array("app","new","obj")
|
|
);
|
|
}
|
|
*/
|
|
return $x;
|
|
}
|
|
/**
|
|
* create a link to a search page
|
|
*/
|
|
function getSelectLink (&$user,$text = "") {
|
|
global $lang,$tutos;
|
|
#if ( ! $user->feature_ok(usecalendar,PERM_SEL) ) {
|
|
return;
|
|
#}
|
|
return array( url => "app_select.php",
|
|
image => $user->layout->theme->getImage(appointment::getHtmlIcon(),'menu'),
|
|
text => ($text == "" ? $lang['Search']: $text),
|
|
info => $lang['SearchForApp'],
|
|
category => array("search","app")
|
|
);
|
|
}
|
|
/**
|
|
* Read a list of appointments
|
|
*/
|
|
function obj_read(&$obj) {
|
|
global $current_user,$table;
|
|
|
|
if ( $obj == -1 ) return;
|
|
if (! is_object($obj) ) return;
|
|
|
|
if ( isset($obj->applist) ) {
|
|
return;
|
|
}
|
|
$obj->applist = array();
|
|
|
|
$q = "SELECT * FROM ". $obj->dbconn->prefix .$table['appointment1'][name];
|
|
if ( $obj->getType() == "product" ) {
|
|
$q .= " WHERE product = ". $obj->id;
|
|
} else if ( ($obj->getType() == "address") || ($obj->getType() == "user") ) {
|
|
$q .= " WHERE visitor = ". $obj->id;
|
|
} else if ( $obj->getType() == "company" ) {
|
|
$obj->read_members();
|
|
$q .= " WHERE visitor in (". $obj->id;
|
|
while ( list ($i,$f) = @each ($obj->member) ) {
|
|
$q .= ",". $i;
|
|
}
|
|
$q .= " )";
|
|
} else if ( $obj->getType() == "department" ) {
|
|
$obj->read_members();
|
|
$q .= " WHERE visitor in (". $obj->id;
|
|
while ( list ($i,$f) = @each ($obj->member) ) {
|
|
$q .= ",". $i;
|
|
}
|
|
$q .= " )";
|
|
} else {
|
|
return;
|
|
}
|
|
$q .= " ORDER BY a_start DESC";
|
|
|
|
# always at the end of query
|
|
check_dbacl( $q, $current_user->id);
|
|
|
|
$r = $obj->dbconn->Exec($q);
|
|
$n = $r->numrows();
|
|
$a = 0;
|
|
while ($a < $n) {
|
|
$p = new appointment($obj->dbconn);
|
|
$p->read_result($r,$a);
|
|
if ( $p->see_ok() ) {
|
|
$obj->applist[$p->id] = &$p;
|
|
}
|
|
$a++;
|
|
unset($p);
|
|
}
|
|
$r->free();
|
|
return;
|
|
}
|
|
/**
|
|
* a object that uses appointments is deleted
|
|
*/
|
|
Function obj_delete(&$user,&$obj) {
|
|
global $table;
|
|
|
|
$msg = "";
|
|
$obj->dbconn->Exec("DELETE FROM ". $obj->dbconn->prefix .$table['appointment2'][name]." WHERE adr_id =" .$obj->id);
|
|
$obj->dbconn->Exec("UPDATE ". $obj->dbconn->prefix .$table['appointment1'][name]." set visitor = null WHERE visitor =" .$obj->id);
|
|
$obj->dbconn->Exec("UPDATE ". $obj->dbconn->prefix .$table['appointment1'][name]." set product = null WHERE product =" .$obj->id);
|
|
return $msg;
|
|
}
|
|
/**
|
|
* create a list of invoices for the given object
|
|
*/
|
|
function infolist (&$user,&$obj,$cols,$format = "html") {
|
|
global $lang;
|
|
|
|
if ( ! $user->feature_ok(usecalendar,PERM_SEE) ) {
|
|
return;
|
|
}
|
|
appointment::obj_read($obj);
|
|
if ( count($obj->applist) > 0 ) {
|
|
@reset($obj->applist);
|
|
echo "<tr>\n";
|
|
echo $user->layout->showfield($lang['Appointments']);
|
|
echo " <td valign=\"top\" Colspan=\"".($cols-1)."\">\n";
|
|
$ext = 0;
|
|
if ($obj->getType() == "product") {
|
|
$ext = 2;
|
|
}
|
|
if ( $format == "paper" ) {
|
|
showApps($user,$obj,0,$ext,-1);
|
|
} else {
|
|
showApps($user,$obj,0,$ext);
|
|
}
|
|
echo " </td>\n";
|
|
echo "</tr>\n";
|
|
}
|
|
}
|
|
/**
|
|
* method called from check service
|
|
* Check for appointments to remember
|
|
*/
|
|
function checkservice (&$user) {
|
|
global $tutos,$lang,$table;
|
|
|
|
$msg = "";
|
|
$d = new DateTime();
|
|
$q = "SELECT * FROM ". $user->dbconn->prefix .$table['appointment1'][name]." WHERE remember > 0 AND remembered = 0";
|
|
$r = $user->dbconn->Exec($q);
|
|
$n = $r->numrows();
|
|
$a = 0;
|
|
while ($a < $n) {
|
|
$app = new appointment($user->dbconn);
|
|
$app->read_result($r,$a);
|
|
$a++;
|
|
|
|
$diff = $app->start->getTimestamp() - $d->getTimeStamp() - ($app->remember * 60);
|
|
|
|
if ( $diff > 0 ) {
|
|
continue;
|
|
}
|
|
# Sent mails
|
|
$url = getBaseURL(true) . $app->getURL();
|
|
$app->read_participants();
|
|
$m = new mail($user);
|
|
$m->setFrom($app->creator);
|
|
$m->addHeader("X-PRIORITY","2");
|
|
$m->addHeader("priority","urgent");
|
|
|
|
$pl = $app->participant;
|
|
@reset($pl);
|
|
while ( list ($i,$f) = @each ($pl) ) {
|
|
$m->addTo($f);
|
|
$body = "";
|
|
if ( ! findMailTemplate("app_remember.proto",$f,$body) ) {
|
|
$msg .= sprintf($lang['Err0037'],$m->subject,$body) ."<br />\n";
|
|
continue;
|
|
}
|
|
$ts = $app->getTimespan();
|
|
$m->setSubject(sprintf($f->lg['EmailRememberApp'], $ts['desc']));
|
|
$app->make_mail_body($body,$f);
|
|
$m->addBody($body,"text/plain",$f->lg['NewAppoint'],"",$f->lg['content_encoding']);
|
|
|
|
if ( $tutos[useical] == 1 ) {
|
|
$m->addBody($app->getIcal(),"text/calendar","ICalEntry.vcs","attachment; filename=ICalEntry.vcs");
|
|
}
|
|
if ( $tutos[usevcard] == 1 ) {
|
|
$m->addBody($app->creator->getVcard(),"text/x-vcard",sprintf($f->lg['MailCard'], $app->creator->getFullName()) );
|
|
}
|
|
$msg .= $m->send();
|
|
$m->resetBody();
|
|
$m->resetTo();
|
|
}
|
|
|
|
# Update the remembered field
|
|
$q = "UPDATE ". $user->dbconn->prefix .$table['appointment1'][name]." SET remembered = ". ($app->remembered + 1) .",remember = 0 WHERE ID = ". $app->id;
|
|
$r2 = $user->dbconn->Exec($q);
|
|
}
|
|
$r->free();
|
|
return $msg;
|
|
}
|
|
|
|
function DateTime1($dt)
|
|
{
|
|
return sprintf ("'%04d-%02d-%02d %02d:%02d:%02d'",$dt->year,$dt->month,$dt->day,$dt->hour,$dt->min,$dt->sec);
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* Read a list of appointments for one day and make it a array in the
|
|
* given object
|
|
* from and to are TUTOS DateTime objects
|
|
*/
|
|
function readCal(&$obj, &$from, &$to) {
|
|
global $msg,$current_user,$table,$db;
|
|
|
|
//if ( ! $current_user->feature_ok(usecalendar,PERM_SEE) ) {
|
|
// return;
|
|
//}
|
|
|
|
$from->setDateTime($from->getYYYYMMDD());
|
|
$to->setDateTime($to->getYYYYMMDD());
|
|
|
|
if ($from->getDate() == $to->getDate()) {
|
|
$to->addDays(1);
|
|
}
|
|
|
|
/*
|
|
$x1 = DateTime1($from);
|
|
$x2 = DateTime1($to);
|
|
*/
|
|
$x1 = sprintf ("%04d-%02d-%02d %02d:%02d:%02d",$from->year,$from->month,$from->day,$from->hour,$from->min,$from->sec);
|
|
|
|
$x2 = sprintf ("%04d-%02d-%02d %02d:%02d:%02d",$to->year,$to->month,$to->day,$to->hour,$to->min,$to->sec);
|
|
|
|
list($sx1,$sx1time) = split(" ",$x1);
|
|
list($sx2,$sx2time) = split(" ",$x2);
|
|
|
|
$from->ts_def -= $current_user->offset;
|
|
$to->ts_def -= $current_user->offset;
|
|
|
|
// Query created by Raj
|
|
#
|
|
# First query ( Get Call appointments )
|
|
#
|
|
#
|
|
// query extended for fetching the accountname from Fredy's patch
|
|
$q=" Select activity.*,crmentity.*,account.accountname,account.accountid FROM ";
|
|
$q.=" activity inner join crmentity on activity.activityid = crmentity.crmid left join";
|
|
$q.=" cntactivityrel on activity.activityid = cntactivityrel.activityid left join ";
|
|
$q.=" contactdetails on cntactivityrel.contactid = contactdetails.contactid left join";
|
|
$q.=" account on contactdetails.accountid = account.accountid";
|
|
$q.=" inner join salesmanactivityrel on salesmanactivityrel.activityid=activity.activityid"; // When adding the users to the event then to show it in the users Calendar of particular user - Jaguar
|
|
$q.=" WHERE ";
|
|
$q.=" activity.activitytype in ('Call','Meeting') AND ";
|
|
if(!is_admin($current_user))
|
|
{
|
|
$q .= " ( ";
|
|
}
|
|
|
|
$q.=" ((activity.date_start < '". $sx2 ."' AND activity.date_start >= '". $sx1."')";
|
|
$q.=" and (activity.date_start like (activity.due_date) or (activity.date_start != '0000-00-00' ))";//query modified by Jag
|
|
#$q .= " OR (a_end < ". $x2 ." AND a_end >= ". $x1 .")";
|
|
#$q .= " OR (a_start < ". $x1 ." AND a_end >= ". $x2 .")";
|
|
#$q .= " OR (date_start < ". $sx1 .")";
|
|
|
|
if(!is_admin($current_user))
|
|
{
|
|
$q .= " ) AND (crmentity.smownerid ='".$current_user->id."' and salesmanactivityrel.smid = '".$current_user->id."') ";
|
|
}
|
|
$q .= " AND crmentity.deleted = 0)";
|
|
$q .= " ORDER by activity.date_start,activity.time_start";
|
|
|
|
$r = $this->db->query($q);
|
|
$n = $this->db->getRowCount($r);
|
|
$a = 0;
|
|
// print("GS --> ".$n." q=".$q);
|
|
|
|
while ( $a < $n ) {
|
|
$o = &new appointment();
|
|
$result = $this->db->fetchByAssoc($r);
|
|
//print_r($result);
|
|
//$o->read_result($r,$a);
|
|
$o->read_result($result);
|
|
$a++;
|
|
if ( $o->see_ok() ) {
|
|
/* Get all participants */
|
|
//$o->read_participants();
|
|
//print("GS --> see");
|
|
$obj->callist[$o->record_id] = &$o;
|
|
}
|
|
unset($o);
|
|
}
|
|
//
|
|
|
|
// Query created by Jaguar
|
|
#
|
|
# Second query ( Get Recurring appointments )
|
|
#
|
|
#
|
|
$q = "SELECT activity.activityid, activity.subject, activity.activitytype, activity.description, activity.time_start, activity.duration_hours, activity.duration_minutes, activity.priority, activity.location,activity.eventstatus, crmentity.*, recurringevents.recurringid, recurringevents.recurringdate as date_start ,recurringevents.recurringtype,account.accountname,account.accountid from activity inner join crmentity on activity.activityid = crmentity.crmid inner join recurringevents on activity.activityid=recurringevents.activityid left join cntactivityrel on activity.activityid = cntactivityrel.activityid left join contactdetails on cntactivityrel.contactid = contactdetails.contactid left join account on contactdetails.accountid = account.accountid inner join salesmanactivityrel on salesmanactivityrel.activityid=activity.activityid";
|
|
|
|
$q.=" where ( activity.activitytype in ('Call','Meeting') AND ";
|
|
if(!is_admin($current_user))
|
|
{
|
|
$q .= " ( ";
|
|
}
|
|
$q .= " (recurringdate < '". $sx2 ."' AND recurringdate >= '". $sx1 . "') ";
|
|
if(!is_admin($current_user))
|
|
{
|
|
$q .= " ) AND (crmentity.smownerid ='".$current_user->id."' and salesmanactivityrel.smid = '".$current_user->id."' ) ";
|
|
}
|
|
$q .= " AND crmentity.deleted = 0 )" ;
|
|
$q .= " ORDER by recurringid";
|
|
$r = $this->db->query($q);
|
|
$n = $this->db->getRowCount($r);
|
|
$a = 0;
|
|
// print("<br>GS --> ".$n." q=".$q);
|
|
while ( $a < $n ) {
|
|
$o = &new appointment();
|
|
$result = $this->db->fetchByAssoc($r);
|
|
//print_r($result);
|
|
//$o->read_result($r,$a);
|
|
$o->read_result($result);
|
|
$a++;
|
|
if ( $o->see_ok() ) {
|
|
/* Get all participants */
|
|
//$o->read_participants();
|
|
//print("GS --> see");
|
|
$obj->callist[$o->record_id] = &$o;
|
|
}
|
|
unset($o);
|
|
}
|
|
|
|
//
|
|
|
|
|
|
/* #
|
|
# First query ( non repeating appointments )
|
|
#
|
|
$q = "SELECT * FROM ". $this->tablename." WHERE ";
|
|
$q .= " (";
|
|
if(!is_admin($current_user))
|
|
{
|
|
$q .= " ( ";
|
|
}
|
|
$q .= " (a_start < ". $x2 ." AND a_start >= ". $x1 .")";
|
|
$q .= " OR (a_end < ". $x2 ." AND a_end >= ". $x1 .")";
|
|
$q .= " OR (a_start < ". $x1 ." AND a_end >= ". $x2 .")";
|
|
if(!is_admin($current_user))
|
|
{
|
|
$q .= " ) AND ( creator = '".$current_user->id."' ) ";
|
|
}
|
|
$q .= " )";
|
|
$q .= " ORDER by a_start";
|
|
|
|
//print("GS --> allowed ".is_admin($current_user)." q=".$q);
|
|
# always at the end of query
|
|
# check_dbacl( $q, $current_user->id);
|
|
|
|
// srini cal appoint
|
|
$r = $this->db->query($q);
|
|
$n = $this->db->getRowCount($r);
|
|
$a = 0;
|
|
//print("GS --> ".$n." q=".$q);
|
|
while ( $a < $n ) {
|
|
$o = &new appointment();
|
|
$result = mysql_fetch_assoc($r);
|
|
//$o->read_result($r,$a);
|
|
$o->read_result($result);
|
|
$a++;
|
|
if ( $o->see_ok() ) { */
|
|
/* Get all participants */
|
|
/* //$o->read_participants();
|
|
//print("GS --> see");
|
|
$obj->callist[$o->id] = &$o;
|
|
}
|
|
unset($o);
|
|
}
|
|
//$r->free();
|
|
|
|
*/
|
|
$x = new DateTime();
|
|
$x->setDateTimeTS($from->ts);
|
|
|
|
$wd = "'". Date("w",$x->getTimeStamp()) ."'";
|
|
$md = "'". Date("j",$x->getTimeStamp()) ."'";
|
|
$ymd = "'". Date("j/n",$x->getTimeStamp()) ."'";
|
|
$x->addDays(1);
|
|
$pre = ",";
|
|
while ( $x->getTimeStamp() < $to->getTimeStamp() ) {
|
|
$wd .= $pre ."'". Date("w",$x->getTimeStamp()) ."'";
|
|
$md .= $pre ."'". Date("j",$x->getTimeStamp()) ."'";
|
|
$ymd .= $pre ."'". Date("j/n",$x->getTimeStamp()) ."'";
|
|
$x->addDays(1);
|
|
}
|
|
#
|
|
# Second query ( repeating appointments w/o end )
|
|
#
|
|
/* $q = "SELECT c.* FROM ". $obj->dbconn->prefix .$table['appointment1'][name]." c WHERE ";
|
|
$q .= " r_ignore = 1 AND (";
|
|
$q .= " ( repeat = 1 AND r_arg in (". $wd .") )";
|
|
$q .= " OR ( repeat = 2 AND r_arg in (". $md .") )";
|
|
$q .= " OR ( repeat = 3 AND r_arg in (". $ymd .") )";
|
|
$q .= " OR ( repeat = 4 )";
|
|
$q .= " ) AND ( a_start <= ". $x2 ." )";
|
|
$q .= "";
|
|
$q .= " ORDER by a_start";
|
|
|
|
*/
|
|
# always at the end of query
|
|
# check_dbacl( $q, $current_user->id);
|
|
|
|
# $r = $obj->dbconn->Exec($q);
|
|
# $n = $r->numrows();
|
|
# $a = 0;
|
|
# while ( $a < $n ) {
|
|
# $o = &new appointment($obj->dbconn);
|
|
# $o->read_result($r,$a);
|
|
# $a++;
|
|
# if ( $o->see_ok() ) {
|
|
/* Get all participants */
|
|
# $o->read_participants();
|
|
# $obj->callist[$o->id] = &$o;
|
|
# }
|
|
# unset($o);
|
|
# }
|
|
# $r->free();
|
|
|
|
#
|
|
# Third query ( repeating appointments with end )
|
|
#
|
|
/* $q = "SELECT c.* FROM ". $obj->dbconn->prefix .$table['appointment1'][name]." c WHERE ";
|
|
$q .= " r_ignore = 0 AND (";
|
|
$q .= " ( repeat = 1 AND r_arg in (". $wd .") )";
|
|
$q .= " OR ( repeat = 2 AND r_arg in (". $md .") )";
|
|
$q .= " OR ( repeat = 3 AND r_arg in (". $ymd .") )";
|
|
$q .= " OR ( repeat = 4 )";
|
|
$q .= ") AND ( (a_start < ". $x2 ." AND a_start >= ". $x1 .")";
|
|
$q .= " OR (a_end < ". $x2 ." AND a_end >= ". $x1 .")";
|
|
$q .= " OR (a_start < ". $x1 ." AND a_end >= ". $x2 .")";
|
|
$q .= ")";
|
|
$q .= " ORDER by a_start";
|
|
*/
|
|
# $r = $obj->dbconn->Exec($q);
|
|
# $n = $r->numrows();
|
|
# $a = 0;
|
|
# while ( $a < $n ) {
|
|
# $o = &new appointment($obj->dbconn);
|
|
# $o->read_result($r,$a);
|
|
# $a++;
|
|
# if ( $o->see_ok() ) {
|
|
/* Get all participants */
|
|
# $o->read_participants();
|
|
# $obj->callist[$o->id] = &$o;
|
|
# }
|
|
# unset($o);
|
|
# }
|
|
# $r->free();
|
|
|
|
return;
|
|
}
|
|
/**
|
|
* get the help index
|
|
*/
|
|
function getHelpIndex () {
|
|
global $lang;
|
|
|
|
$r = "";
|
|
$r .= "<h3>". makelink("help.php?p=glossary#appointment",$lang["Calendar"],$lang["Calendar"]) ."</h3><ul>\n";
|
|
$r .= "<li>". makelink("help.php?p=app_new",$lang["NewEntry"]."/". $lang["Modify"],$lang["NewEntry"]."/". $lang["Modify"]) ."</li>\n";
|
|
$r .= "<li>". makelink("help.php?p=calendar",$lang["show"],$lang["show"]) ."</li>\n";
|
|
$r .= "</ul>\n";
|
|
echo $r;
|
|
}
|
|
}
|
|
?>
|
|
|