X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/timetracker.git/blobdiff_plain/f54ca9d66b525ec1cd7076744c8a022e8b4b488d..7af7d601282b0ea3138d05c300163e18e121ec32:/WEB-INF/lib/ttOrgImportHelper.class.php diff --git a/WEB-INF/lib/ttOrgImportHelper.class.php b/WEB-INF/lib/ttOrgImportHelper.class.php index cce763da..c70d2580 100644 --- a/WEB-INF/lib/ttOrgImportHelper.class.php +++ b/WEB-INF/lib/ttOrgImportHelper.class.php @@ -26,7 +26,6 @@ // | https://www.anuko.com/time_tracker/credits.htm // +----------------------------------------------------------------------+ -import('ttTeamHelper'); import('ttUserHelper'); import('ttProjectHelper'); import('ttTaskHelper'); @@ -50,56 +49,88 @@ class ttOrgImportHelper { var $canImport = true; // False if we cannot import data due to a login collision. var $firstPass = true; // True during first pass through the file. + var $org_id = null; // Organization id (same as top group_id). + var $current_parent_group_id = null; // Current parent group id as we parse the file. + // Set when we create a new group. + // Entities for current group. + var $currentGroupRoles = array(); // Array of arrays of role properties. + // var $currentGroupUsers = array(); // Array of arrays of user properties. + + // Entity maps for current group. They map XML ids with database ids. + var $currentGroupRoleMap = array(); // Maps role ids from XML to their database ids. + //var $userMap = array(); // User ids. + //var $projectMap = array(); // Project ids. + //var $taskMap = array(); // Task ids. + //var $clientMap = array(); // Client ids. + //var $invoiceMap = array(); // Invoice ids. + // Constructor. function __construct(&$errors) { $this->errors = &$errors; } - // startElement - callback handler for opening tag of an XML element. - // In this function we assign passed in attributes to currentElement. + // startElement - callback handler for opening tag of an XML element in the file. function startElement($parser, $name, $attrs) { +/* if ($name == 'GROUP' || $name == 'USER') { $this->currentElement = $attrs; } $this->currentTag = $name; - } - - // endElement - callback handler for the closing tag of an XML element. - // When we are here, currentElement is an array of the element attributes (as set in startElement). - // Here we do the actual import of data into the database. - function endElement($parser, $name) { - // During first pass we only check user logins. +*/ + // First pass. We only check user logins for potential collisions with existing. if ($this->firstPass) { if ($name == 'USER' && $this->canImport) { - if ('' != $this->currentElement['STATUS'] && ttUserHelper::getUserByLogin($this->currentElement['LOGIN'])) { + if ('' != $attrs['STATUS'] && ttUserHelper::getUserByLogin($attrs['LOGIN'])) { // We have a login collision, cannot import any data. $this->canImport = false; } } - $this->currentTag = ''; + //$this->currentTag = ''; } - // During second pass we import data. + // Second pass processing. We import data here, one tag at a time. if (!$this->firstPass && $this->canImport) { - // TODO: write code here. Nothing is imported currently. - } - } + $mdb2 = getConnection(); - // dataElement - callback handler for text data fragments. It builds up currentElement array with text pieces from XML. - function dataElement($parser, $data) { - if ($this->currentTag == 'NAME' - || $this->currentTag == 'DESCRIPTION' - || $this->currentTag == 'LABEL' - || $this->currentTag == 'VALUE' - || $this->currentTag == 'COMMENT' - || $this->currentTag == 'ADDRESS' - || $this->currentTag == 'ALLOW_IP' - || $this->currentTag == 'PASSWORD_COMPLEXITY') { - if (isset($this->currentElement[$this->currentTag])) - $this->currentElement[$this->currentTag] .= trim($data); - else - $this->currentElement[$this->currentTag] = trim($data); + // We are in second pass through the XML file and can import data. + if ($name == 'GROUP') { + // Create a new group. + $group_id = $this->createGroup(array( + 'parent_id' => $this->current_parent_group_id, + 'org_id' => $this->org_id, + 'name' => $this->currentElement['NAME'], + 'currency' => $this->currentElement['CURRENCY'], + 'lang' => $this->currentElement['LANG'])); + // We only have 3 properties in export at the moment, while work is ongoing... + + // Special handling for top group. + if (!$this->org_id) { + $this->org_id = $group_id; + $sql = "update tt_groups set org_id = $group_id where org_id is NULL and id = $group_id"; + $affected = $mdb2->exec($sql); + // TODO: design a better error handling approach for the entire import process. + } + // Set current parent group. + $this->current_parent_group_id = $group_id; + } + + if ($name == 'ROLES') { + // If we get here, we have to recycle both $currentGroupRoles and $currentGroupRoleMap. + unset($this->currentGroupRoles); + unset($this->currentGroupRoleMap); + $this->currentGroupRoles = array(); + $this->currentGroupRoleMap = array(); + // Both arrays are now empty. + // They will get reconstructed after processing of elements in XML. See below. + } + + if ($name == 'ROLE') { + // We get here when processing a tag for the current group. + // Add new role to $this->currentGroupRoles and a mapping to $this->currentGroupRoleMap. + $this->currentGroupRoles[$this->currentElement['ID']] = $this->currentElement; + $this->currentElement = array(); + } } } @@ -137,8 +168,7 @@ class ttOrgImportHelper { // Initialize XML parser. $parser = xml_parser_create(); xml_set_object($parser, $this); - xml_set_element_handler($parser, 'startElement', 'endElement'); - xml_set_character_data_handler($parser, 'dataElement'); + xml_set_element_handler($parser, 'startElement', false); // We need to parse the file 2 times: // 1) First pass: determine if import is possible - there must be no login collisions. @@ -171,8 +201,7 @@ class ttOrgImportHelper { // Now we can do a second pass, where real work is done. $parser = xml_parser_create(); xml_set_object($parser, $this); - xml_set_element_handler($parser, 'startElement', 'endElement'); - xml_set_character_data_handler($parser, 'dataElement'); + xml_set_element_handler($parser, 'startElement', false); // Read and parse the content of the file. During parsing, startElement, endElement, and dataElement functions are called. $file = fopen($filename, 'r'); @@ -213,4 +242,49 @@ class ttOrgImportHelper { fclose ($out_file); return true; } + + // createGroup function creates a new group. + private function createGroup($fields) { + + global $user; + $mdb2 = getConnection(); + + $columns = '(parent_id, org_id, name, currency, lang)'; + +// $columns = '(name, currency, decimal_mark, lang, date_format, time_format, week_start, tracking_mode'. +// ', project_required, task_required, record_type, bcc_email, allow_ip, password_complexity, plugins'. +// ', lock_spec, workday_minutes, config, created, created_ip, created_by)'; + + $values = ' values ('; + $values .= $mdb2->quote($fields['parent_id']); + $values .= ', '.$mdb2->quote($fields['org_id']); + $values .= ', '.$mdb2->quote(trim($fields['name'])); + $values .= ', '.$mdb2->quote(trim($fields['currency'])); + //$values .= ', '.$mdb2->quote($fields['decimal_mark']); + $values .= ', '.$mdb2->quote($fields['lang']); +/* + $values .= ', '.$mdb2->quote($fields['date_format']); + $values .= ', '.$mdb2->quote($fields['time_format']); + $values .= ', '.(int)$fields['week_start']; + $values .= ', '.(int)$fields['tracking_mode']; + $values .= ', '.(int)$fields['project_required']; + $values .= ', '.(int)$fields['task_required']; + $values .= ', '.(int)$fields['record_type']; + $values .= ', '.$mdb2->quote($fields['bcc_email']); + $values .= ', '.$mdb2->quote($fields['allow_ip']); + $values .= ', '.$mdb2->quote($fields['password_complexity']); + $values .= ', '.$mdb2->quote($fields['plugins']); + $values .= ', '.$mdb2->quote($fields['lock_spec']); + $values .= ', '.(int)$fields['workday_minutes']; + $values .= ', '.$mdb2->quote($fields['config']); + $values .= ', now(), '.$mdb2->quote($_SERVER['REMOTE_ADDR']).', '.$mdb2->quote($user->id); */ + $values .= ')'; + + $sql = 'insert into tt_groups '.$columns.$values; + $affected = $mdb2->exec($sql); + if (is_a($affected, 'PEAR_Error')) return false; + + $group_id = $mdb2->lastInsertID('tt_groups', 'id'); + return $group_id; + } }