' . _('File Upload') . glyph('ok-circle') . '' . mute(glyph('arrow-right')) . _('Validation') . mute(glyph('arrow-right')) . mute(_('Import')) ] ) . form( [ div('row', [ div('col-sm-6', [ '

' . _('Rooms to create') . '

', table(_('Name'), $rooms_new) ]), div('col-sm-6', [ '

' . _('Rooms to delete') . '

', table(_('Name'), $rooms_deleted) ]) ]), '

' . _('Shifts to create') . '

', table([ 'day' => _('Day'), 'start' => _('Start'), 'end' => _('End'), 'shifttype' => _('Shift type'), 'title' => _('Title'), 'room' => _('Room') ], shifts_printable($events_new, $shifttypes)), '

' . _('Shifts to update') . '

', table([ 'day' => _('Day'), 'start' => _('Start'), 'end' => _('End'), 'shifttype' => _('Shift type'), 'title' => _('Title'), 'room' => _('Room') ], shifts_printable($events_updated, $shifttypes)), '

' . _('Shifts to delete') . '

', table([ 'day' => _('Day'), 'start' => _('Start'), 'end' => _('End'), 'shifttype' => _('Shift type'), 'title' => _('Title'), 'room' => _('Room') ], shifts_printable($events_deleted, $shifttypes)), form_submit('submit', _('Import')) ], page_link_to('admin_import') . '&step=import&shifttype_id=' . $shifttype_id . '&add_minutes_end=' . $add_minutes_end . '&add_minutes_start=' . $add_minutes_start ); break; case 'import': if (!file_exists($import_file)) { error(_('Missing import file.')); redirect(page_link_to('admin_import')); } if (!file_exists($import_file)) { redirect(page_link_to('admin_import')); } if (isset($_REQUEST['shifttype_id']) && isset($shifttypes[$_REQUEST['shifttype_id']])) { $shifttype_id = $_REQUEST['shifttype_id']; } else { error(_('Please select a shift type.')); redirect(page_link_to('admin_import')); } if (isset($_REQUEST['add_minutes_start']) && is_numeric(trim($_REQUEST['add_minutes_start']))) { $add_minutes_start = trim($_REQUEST['add_minutes_start']); } else { error(_('Please enter an amount of minutes to add to a talk\'s begin.')); redirect(page_link_to('admin_import')); } if (isset($_REQUEST['add_minutes_end']) && is_numeric(trim($_REQUEST['add_minutes_end']))) { $add_minutes_end = trim($_REQUEST['add_minutes_end']); } else { error(_('Please enter an amount of minutes to add to a talk\'s end.')); redirect(page_link_to('admin_import')); } list($rooms_new, $rooms_deleted) = prepare_rooms($import_file); foreach ($rooms_new as $room) { $result = Room_create($room, true, true); if ($result === false) { engelsystem_error('Unable to create room.'); } $rooms_import[trim($room)] = sql_id(); } foreach ($rooms_deleted as $room) { sql_query("DELETE FROM `Room` WHERE `Name`='" . sql_escape($room) . "' LIMIT 1"); } list($events_new, $events_updated, $events_deleted) = prepare_events( $import_file, $shifttype_id, $add_minutes_start, $add_minutes_end ); foreach ($events_new as $event) { $result = Shift_create($event); if ($result === false) { engelsystem_error('Unable to create shift.'); } } foreach ($events_updated as $event) { $result = Shift_update_by_psid($event); if ($result === false) { engelsystem_error('Unable to update shift.'); } } foreach ($events_deleted as $event) { $result = Shift_delete_by_psid($event['PSID']); if ($result === false) { engelsystem_error('Unable to delete shift.'); } } engelsystem_log('Frab import done'); unlink($import_file); $html .= div('well well-sm text-center', [ '' . _('File Upload') . glyph('ok-circle') . '' . mute(glyph('arrow-right')) . '' . _('Validation') . glyph('ok-circle') . '' . mute(glyph('arrow-right')) . '' . _('Import') . glyph('ok-circle') . '' ]) . success(_('It\'s done!'), true); break; default: redirect(page_link_to('admin_import')); } return page_with_title(admin_import_title(), [ msg(), $html ]); } /** * @param string $file * @return array */ function prepare_rooms($file) { global $rooms_import; $data = read_xml($file); // Load rooms from db for compare with input $rooms = sql_select('SELECT * FROM `Room` WHERE `FromPentabarf`=\'Y\''); $rooms_db = []; $rooms_import = []; foreach ($rooms as $room) { $rooms_db[] = (string)$room['Name']; $rooms_import[$room['Name']] = $room['RID']; } $events = $data->vcalendar->vevent; $rooms_pb = []; foreach ($events as $event) { $rooms_pb[] = (string)$event->location; if (!isset($rooms_import[trim($event->location)])) { $rooms_import[trim($event->location)] = trim($event->location); } } $rooms_pb = array_unique($rooms_pb); $rooms_new = array_diff($rooms_pb, $rooms_db); $rooms_deleted = array_diff($rooms_db, $rooms_pb); return [ $rooms_new, $rooms_deleted ]; } /** * @param string $file * @param int $shifttype_id * @param int $add_minutes_start * @param int $add_minutes_end * @return array */ function prepare_events($file, $shifttype_id, $add_minutes_start, $add_minutes_end) { global $rooms_import; $data = read_xml($file); $rooms = sql_select('SELECT * FROM `Room`'); $rooms_db = []; foreach ($rooms as $room) { $rooms_db[$room['Name']] = $room['RID']; } $events = $data->vcalendar->vevent; $shifts_pb = []; foreach ($events as $event) { $event_pb = $event->children('http://pentabarf.org'); $event_id = trim($event_pb->{'event-id'}); $shifts_pb[$event_id] = [ 'shifttype_id' => $shifttype_id, 'start' => parse_date("Ymd\THis", $event->dtstart) - $add_minutes_start * 60, 'end' => parse_date("Ymd\THis", $event->dtend) + $add_minutes_end * 60, 'RID' => $rooms_import[trim($event->location)], 'title' => trim($event->summary), 'URL' => trim($event->url), 'PSID' => $event_id ]; } $shifts = sql_select('SELECT * FROM `Shifts` WHERE `PSID` IS NOT NULL ORDER BY `start`'); $shifts_db = []; foreach ($shifts as $shift) { $shifts_db[$shift['PSID']] = $shift; } $shifts_new = []; $shifts_updated = []; foreach ($shifts_pb as $shift) { if (!isset($shifts_db[$shift['PSID']])) { $shifts_new[] = $shift; } else { $tmp = $shifts_db[$shift['PSID']]; if ( $shift['shifttype_id'] != $tmp['shifttype_id'] || $shift['title'] != $tmp['title'] || $shift['start'] != $tmp['start'] || $shift['end'] != $tmp['end'] || $shift['RID'] != $tmp['RID'] || $shift['URL'] != $tmp['URL'] ) { $shifts_updated[] = $shift; } } } $shifts_deleted = []; foreach ($shifts_db as $shift) { if (!isset($shifts_pb[$shift['PSID']])) { $shifts_deleted[] = $shift; } } return [ $shifts_new, $shifts_updated, $shifts_deleted ]; } /** * @param string $file * @return SimpleXMLElement */ function read_xml($file) { global $xml_import; if (!isset($xml_import)) { $xml_import = simplexml_load_file($file); } return $xml_import; } /** * @param array $shifts * @param array $shifttypes * @return array */ function shifts_printable($shifts, $shifttypes) { global $rooms_import; $rooms = array_flip($rooms_import); uasort($shifts, 'shift_sort'); $shifts_printable = []; foreach ($shifts as $shift) { $shifts_printable[] = [ 'day' => date('l, Y-m-d', $shift['start']), 'start' => date('H:i', $shift['start']), 'shifttype' => ShiftType_name_render([ 'id' => $shift['shifttype_id'], 'name' => $shifttypes[$shift['shifttype_id']] ]), 'title' => shorten($shift['title']), 'end' => date('H:i', $shift['end']), 'room' => $rooms[$shift['RID']] ]; } return $shifts_printable; } /** * @param array $shift_a * @param array $shift_b * @return int */ function shift_sort($shift_a, $shift_b) { return ($shift_a['start'] < $shift_b['start']) ? -1 : 1; }