//   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;
Ejemplo n.º 2
0
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;
}