// or (b) there is only one room in the new set of bookings, in which case // what has happened is that the booking has been changed to be in // a new room // or (c) the new set of rooms does not include the original room, in which // case we will make the arbitrary assumption that the original booking // has been moved to the first room in the list and the bookings in the // other rooms are clones and will be treated as new bookings. if (isset($original_room_id) && ($original_room_id == $room_id || count($rooms) == 1 || $rooms[0] == $room_id && !in_array($original_room_id, $rooms))) { // This is an existing booking which has been changed. Keep the // original ical_uid and increment the sequence number. $data['ical_uid'] = $ical_uid; $data['ical_sequence'] = $ical_sequence + 1; } else { // This is a new booking. We generate a new ical_uid and start // the sequence at 0. $data['ical_uid'] = generate_global_uid($name); $data['ical_sequence'] = 0; } $data['start_time'] = $starttime; $data['end_time'] = $endtime; $data['room_id'] = $room_id; $data['create_by'] = $create_by; $data['name'] = $name; $data['type'] = $type; $data['description'] = $description; $data['status'] = $status; $data['custom_fields'] = $custom_fields; $data['rep_type'] = $rep_type; if ($edit_type == "series") { $data['end_date'] = $end_date; $data['rep_opt'] = $rep_opt;
function process_event($vevent) { global $import_default_type, $skip; global $morningstarts, $morningstarts_minutes, $resolution; // We are going to cache the settings ($resolution etc.) for the rooms // in order to avoid lots of database lookups static $room_settings = array(); // Set up the booking with some defaults $booking = array(); $booking['status'] = 0; $booking['rep_type'] = REP_NONE; $booking['type'] = $import_default_type; // Parse all the lines first because we'll need to get the start date // for calculating some of the other settings $properties = array(); $problems = array(); $line = current($vevent); while ($line !== FALSE) { $property = parse_ical_property($line); // Ignore any sub-components (eg a VALARM inside a VEVENT) as MRBS does not // yet handle things like reminders. Skip through to the end of the sub- // component. Just in case you can have sub-components at a greater depth // than 1 (not sure if you can), make sure we've got to the matching END. if ($property['name'] != 'BEGIN') { $properties[$property['name']] = array('params' => $property['params'], 'value' => $property['value']); } else { $component = $property['value']; while (!($property['name'] == 'END' && $property['value'] == $component) && ($line = next($vevent))) { $property = parse_ical_property($line); } } $line = next($vevent); } // Get the start time because we'll need it later if (!isset($properties['DTSTART'])) { trigger_error("No DTSTART", E_USER_WARNING); } else { $booking['start_time'] = get_time($properties['DTSTART']['value'], $properties['DTSTART']['params']); } // Now go through the rest of the properties foreach ($properties as $name => $details) { switch ($name) { case 'ORGANIZER': $booking['create_by'] = get_create_by($details['value']); break; case 'SUMMARY': $booking['name'] = $details['value']; break; case 'DESCRIPTION': $booking['description'] = $details['value']; break; case 'LOCATION': $error = ''; $booking['room_id'] = get_room_id($details['value'], $error); if ($booking['room_id'] === FALSE) { $problems[] = $error; } break; case 'DTEND': $booking['end_time'] = get_time($details['value'], $details['params']); break; case 'DURATION': trigger_error("DURATION not yet supported by MRBS", E_USER_WARNING); break; case 'RRULE': $rrule_errors = array(); $repeat_details = get_repeat_details($details['value'], $booking['start_time'], $rrule_errors); if ($repeat_details === FALSE) { $problems = array_merge($problems, $rrule_errors); } else { foreach ($repeat_details as $key => $value) { $booking[$key] = $value; } } break; case 'CLASS': if (in_array($details['value'], array('PRIVATE', 'CONFIDENTIAL'))) { $booking['status'] |= STATUS_PRIVATE; } break; case 'STATUS': if ($details['value'] == 'TENTATIVE') { $booking['status'] |= STATUS_TENTATIVE; } break; case 'UID': $booking['ical_uid'] = $details['value']; break; case 'SEQUENCE': $booking['ical_sequence'] = $details['value']; break; case 'LAST-MODIFIED': // We probably ought to do something with LAST-MODIFIED and use it // for the timestamp field break; default: break; } } // If we didn't manage to work out a username then just put the booking // under the name of the current user if (!isset($booking['create_by'])) { $booking['create_by'] = getUserName(); } // A SUMMARY is optional in RFC 5545, however a brief description is mandatory // in MRBS. So if the VEVENT didn't include a name, we'll give it one if (!isset($booking['name'])) { $booking['name'] = "Imported event - no SUMMARY name"; } // On the other hand a UID is mandatory in RFC 5545. We'll be lenient and // provide one if it is missing if (!isset($booking['ical_uid'])) { $booking['ical_uid'] = generate_global_uid($booking['name']); $booking['sequence'] = 0; // and we'll start the sequence from 0 } // LOCATION is optional in RFC 5545 but is obviously mandatory in MRBS. // We could maybe have a default room on the form and use that if (!isset($booking['room_id'])) { $problems[] = get_vocab("no_LOCATION"); } if (empty($problems)) { // Get the area settings for this room, if we haven't got them already if (!isset($room_settings[$booking['room_id']])) { get_area_settings(get_area($booking['room_id'])); $room_settings[$booking['room_id']]['morningstarts'] = $morningstarts; $room_settings[$booking['room_id']]['morningstarts_minutes'] = $morningstarts_minutes; $room_settings[$booking['room_id']]['resolution'] = $resolution; } // Round the start and end times to slot boundaries $date = getdate($booking['start_time']); $m = $date['mon']; $d = $date['mday']; $y = $date['year']; $am7 = mktime($room_settings[$booking['room_id']]['morningstarts'], $room_settings[$booking['room_id']]['morningstarts_minutes'], 0, $m, $d, $y); $booking['start_time'] = round_t_down($booking['start_time'], $room_settings[$booking['room_id']]['resolution'], $am7); $booking['end_time'] = round_t_up($booking['end_time'], $room_settings[$booking['room_id']]['resolution'], $am7); // Make the bookings $bookings = array($booking); $result = mrbsMakeBookings($bookings, NULL, FALSE, $skip); if ($result['valid_booking']) { return TRUE; } } // There were problems - list them echo "<div class=\"problem_report\">\n"; echo get_vocab("could_not_import") . " UID:" . htmlspecialchars($booking['ical_uid']); echo "<ul>\n"; foreach ($problems as $problem) { echo "<li>" . htmlspecialchars($problem) . "</li>\n"; } if (!empty($result['rules_broken'])) { echo "<li>" . get_vocab("rules_broken") . "\n"; echo "<ul>\n"; foreach ($result['rules_broken'] as $rule) { echo "<li>{$rule}</li>\n"; } echo "</ul></li>\n"; } if (!empty($result['conflicts'])) { echo "<li>" . get_vocab("conflict") . "\n"; echo "<ul>\n"; foreach ($result['conflicts'] as $conflict) { echo "<li>{$conflict}</li>\n"; } echo "</ul></li>\n"; } echo "</ul>\n"; echo "</div>\n"; return FALSE; }