/** * Create Sugar meetings from calendar events * @param SugarBean $parent related object to associate with meetings */ function createSugarEvents($parent = NULL) { require_once 'modules/Meetings/Meeting.php'; // if email description contains a meeting id that exists, don't create new meeting if (isset($parent) && !empty($parent->description)) { preg_match('/record=(.*)>/', $parent->description, $match); if (!empty($match[1])) { $meeting = new Meeting(); $meeting->disable_row_level_security = true; $prev_meeting = $meeting->retrieve_by_string_fields(array("id" => $match[1])); if (isset($prev_meeting)) { return; } } } foreach ($this->data['calendar'] as $calendar_key => $calendar_val) { foreach ($calendar_val->stack as $key => $val) { if (!$val instanceof vEvent) { continue; } $meeting = BeanFactory::getBean('Meetings'); // Hack - we don't care about this bean's permissions $meeting->disable_row_level_security = true; $prev_seq = 0; $prev_exists = false; $prev_meeting = $meeting->retrieve_by_string_fields(array("outlook_id" => $val->event->uid)); if (isset($prev_meeting) && !empty($prev_meeting->id)) { $prev_seq = (int) $prev_meeting->sequence; $prev_exists = true; } if (isset($val->event->status) && $val->event->status == 'CANCELLED' && !$prev_exists) { // can't cancel non-existing event, skip continue; } if (!$prev_exists || $prev_exists && $val->event->sequence > $prev_seq) { // insert if doesn't exist, otherwise overwrite it with newer data if current meeting's sequence is greater than prev. sequence if ($parent) { $meeting->assigned_user_id = $parent->assigned_user_id; $meeting->team_set_id = $parent->team_set_id; $meeting->team_id = $parent->team_id; $meeting->parent_id = $parent->id; $meeting->parent_type = $parent->module_dir; } $meeting->date_start = $val->event->date_start; $meeting->date_end = $val->event->date_end; $meeting->name = $val->event->name; $meeting->date_entered = $val->event->date_created; $meeting->date_modified = $val->event->date_modified; $meeting->location = $val->event->location; $dateDiff = strtotime($val->event->date_end) - strtotime($val->event->date_start); $diffHours = floor($dateDiff / (60 * 60)); $diffMinutes = $dateDiff % (60 * 60) / (60 * 60) * 60; $meeting->duration_hours = $diffHours; $meeting->duration_minutes = $diffMinutes; $meeting->outlook_id = $val->event->uid; $meeting->sequence = $val->event->sequence; if ($prev_exists && $val->event->status == 'CANCELLED') { $meeting->deleted = 1; $meeting->mark_deleted($meeting->id); continue; } $meeting_id = $meeting->save(); // invite people $emails = array(); foreach ($val->event->attendees as $attendee) { if (!empty($attendee['email'])) { $emails[] = "ea.email_address_caps=" . $meeting->db->quoted($this->cleanEmail($attendee['email'])); } } if (!empty($val->event->organizer) && !empty($val->event->organizer['email'])) { $emails[] = "ea.email_address_caps=" . $meeting->db->quoted($this->cleanEmail($val->event->organizer['email'])); } if (!empty($emails)) { $query = join(" OR ", $emails); $invitees = $meeting->db->query("SELECT eabr.bean_id, eabr.bean_module FROM email_addr_bean_rel eabr\n\t\t\t\t\t JOIN email_addresses ea ON eabr.email_address_id=ea.id\n\t\t\t\t\t WHERE eabr.deleted=0 AND ea.deleted=0 AND eabr.bean_module IN ('Users','Contacts','Leads') AND ({$query})\n\t\t\t\t\t "); $ids = array_flip($meeting->relationship_fields); while ($inv = $meeting->db->fetchByAssoc($invitees)) { $module = strtolower($inv['bean_module']); $relname = "meetings_{$module}"; $linkfields = VardefManager::getLinkFieldForRelationship("Meetings", "Meeting", $relname); $bean = BeanFactory::getBean($inv['bean_module']); if (empty($bean)) { $GLOBALS['log']->info("createSugarEvents: Don't know how to create bean {$inv['bean_module']}"); continue; } // Hack - we don't care about this bean's permissions $bean->disable_row_level_security = true; $bean->retrieve($inv["bean_id"]); $linkname = $linkfields['name']; $meeting->load_relationship($linkname); if (empty($meeting->{$linkname})) { $GLOBALS['log']->info("createSugarEvents: Unknown module {$module} with link {$linkname} encountered for id {$inv["bean_id"]}"); continue; } $GLOBALS['log']->info("Adding link for {$inv["bean_id"]} module {$module} relname {$relname} linkname {$linkname}"); $meeting->{$linkname}->add($bean); } } } } } }