X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/timetracker.git/blobdiff_plain/56f1fd19f2c9c72878395b3275f03f192ccca082..4255418fd8d5a23ff005e4136a0b173b9ad62bd0:/WEB-INF/lib/ttOrgImportHelper.class.php diff --git a/WEB-INF/lib/ttOrgImportHelper.class.php b/WEB-INF/lib/ttOrgImportHelper.class.php index 622b3fec..ada23286 100644 --- a/WEB-INF/lib/ttOrgImportHelper.class.php +++ b/WEB-INF/lib/ttOrgImportHelper.class.php @@ -32,12 +32,16 @@ import('ttTaskHelper'); import('ttProjectHelper'); import('ttClientHelper'); import('ttInvoiceHelper'); +import('ttCustomFieldHelper'); +import('ttExpenseHelper'); +import('ttFavReportHelper'); // ttOrgImportHelper - this class is a future replacement for ttImportHelper. // Currently, it is work in progress. // When done, it should handle import of complex groups consisting of other groups. class ttOrgImportHelper { var $errors = null; // Errors go here. Set in constructor by reference. + var $schema_version = null; // Database schema version from XML file we import from. var $conflicting_entities = null; // A comma-separated list of entity names we cannot import. var $canImport = true; // False if we cannot import data due to a conflict such as login collision. var $firstPass = true; // True during first pass through the file. @@ -55,6 +59,8 @@ class ttOrgImportHelper { var $currentGroupUserMap = array(); var $currentGroupInvoiceMap = array(); var $currentGroupLogMap = array(); + var $currentGroupCustomFieldMap = array(); + var $currentGroupCustomFieldOptionMap = array(); // Constructor. function __construct(&$errors) { @@ -68,6 +74,18 @@ class ttOrgImportHelper { // First pass. We only check user logins for potential collisions with existing. if ($this->firstPass) { + if ($name == 'ORG' && $this->canImport) { + if ($attrs['SCHEMA'] == null) { + // We need (database) schema attribute to be available for import to work. + // Old Time Tracker export files don't have this. + // Current import code does not work with old format because we had to + // restructure data in export files for subgroup support. + $this->canImport = false; + $this->errors->add($i18n->get('error.format')); + return; + } + } + if ($name == 'USER' && $this->canImport) { $login = $attrs['LOGIN']; if ('' != $attrs['STATUS'] && ttUserHelper::getUserByLogin($login)) { @@ -311,6 +329,128 @@ class ttOrgImportHelper { $this->currentGroupLogMap[$attrs['ID']] = $log_item_id; } else $this->errors->add($i18n->get('error.db')); } + + if ($name == 'CUSTOM_FIELDS') { + // If we get here, we have to recycle $currentGroupCustomFieldMap. + unset($this->currentGroupCustomFieldMap); + $this->currentGroupCustomFieldMap = array(); + // Custom field map is reconstructed after processing elements in XML. See below. + } + + if ($name == 'CUSTOM_FIELD') { + // We get here when processing tags for the current group. + $custom_field_id = ttCustomFieldHelper::insertField(array( + 'group_id' => $this->current_group_id, + // 'org_id' => $this->org_id, TODO: add this when org_id field is added to the table. + 'type' => $attrs['TYPE'], + 'label' => $attrs['LABEL'], + 'required' => $attrs['REQUIRED'], + 'status' => $attrs['STATUS'])); + if ($custom_field_id) { + // Add a mapping. + $this->currentGroupCustomFieldMap[$attrs['ID']] = $custom_field_id; + } else $this->errors->add($i18n->get('error.db')); + } + + if ($name == 'CUSTOM_FIELD_OPTIONS') { + // If we get here, we have to recycle $currentGroupCustomFieldOptionMap. + unset($this->currentGroupCustomFieldOptionMap); + $this->currentGroupCustomFieldOptionMap = array(); + // Custom field option map is reconstructed after processing elements in XML. See below. + } + + if ($name == 'CUSTOM_FIELD_OPTION') { + // We get here when processing tags for the current group. + $custom_field_option_id = ttCustomFieldHelper::insertOption(array( + // 'group_id' => $this->current_group_id, TODO: add this when group_id field is added to the table. + // 'org_id' => $this->org_id, TODO: add this when org_id field is added to the table. + 'field_id' => $this->currentGroupCustomFieldMap[$attrs['FIELD_ID']], + 'value' => $attrs['VALUE'])); + if ($custom_field_option_id) { + // Add a mapping. + $this->currentGroupCustomFieldOptionMap[$attrs['ID']] = $custom_field_option_id; + } else $this->errors->add($i18n->get('error.db')); + } + + if ($name == 'CUSTOM_FIELD_LOG_ENTRY') { + // We get here when processing tags for the current group. + if (!ttCustomFieldHelper::insertLogEntry(array( + // 'group_id' => $this->current_group_id, TODO: add this when group_id field is added to the table. + // 'org_id' => $this->org_id, TODO: add this when org_id field is added to the table. + 'log_id' => $this->currentGroupLogMap[$attrs['LOG_ID']], + 'field_id' => $this->currentGroupCustomFieldMap[$attrs['FIELD_ID']], + 'option_id' => $this->currentGroupCustomFieldOptionMap[$attrs['OPTION_ID']], + 'value' => $attrs['VALUE'], + 'status' => $attrs['STATUS']))) { + $this->errors->add($i18n->get('error.db')); + } + } + + if ($name == 'EXPENSE_ITEM') { + // We get here when processing tags for the current group. + $expense_item_id = ttExpenseHelper::insert(array( + 'date' => $attrs['DATE'], + 'user_id' => $this->currentGroupUserMap[$attrs['USER_ID']], + 'group_id' => $this->current_group_id, + // 'org_id' => $this->org_id, TODO: add this when org_id field is added to the table. + 'client_id' => $this->currentGroupClientMap[$attrs['CLIENT_ID']], + 'project_id' => $this->currentGroupProjectMap[$attrs['PROJECT_ID']], + 'name' => $attrs['NAME'], + 'cost' => $attrs['COST'], + 'invoice_id' => $this->currentGroupInvoiceMap[$attrs['INVOICE_ID']], + 'paid' => $attrs['PAID'], + 'status' => $attrs['STATUS'])); + if (!$expense_item_id) $this->errors->add($i18n->get('error.db')); + } + + if ($name == 'MONTHLY_QUOTA') { + if (!$this->insertMonthlyQuota($this->current_group_id, + // 'org_id' => $this->org_id, TODO: add this when org_id field is added to the table. + $attrs['YEAR'], + $attrs['MONTH'], + $attrs['MINUTES'])) { + $this->errors->add($i18n->get('error.db')); + } + } + + if ($name == 'FAV_REPORT') { + $user_list = ''; + if (strlen($attrs['USERS']) > 0) { + $arr = explode(',', $attrs['USERS']); + foreach ($arr as $v) + $user_list .= (strlen($user_list) == 0 ? '' : ',').$this->currentGroupUserMap[$v]; + } + $fav_report_id = ttFavReportHelper::insertReport(array( + 'name' => $attrs['NAME'], + 'user_id' => $this->currentGroupUserMap[$attrs['USER_ID']], + 'client' => $this->currentGroupClientMap[$attrs['CLIENT_ID']], + 'option' => $this->currentGroupCustomFieldOptionMap[$attrs['CF_1_OPTION_ID']], + 'project' => $this->currentGroupProjectMap[$attrs['PROJECT_ID']], + 'task' => $this->currentGroupTaskMap[$attrs['TASK_ID']], + 'billable' => $attrs['BILLABLE'], + 'users' => $user_list, + 'period' => $attrs['PERIOD'], + 'from' => $attrs['PERIOD_START'], + 'to' => $attrs['PERIOD_END'], + 'chclient' => (int) $attrs['SHOW_CLIENT'], + 'chinvoice' => (int) $attrs['SHOW_INVOICE'], + 'chpaid' => (int) $attrs['SHOW_PAID'], + 'chip' => (int) $attrs['SHOW_IP'], + 'chproject' => (int) $attrs['SHOW_PROJECT'], + 'chstart' => (int) $attrs['SHOW_START'], + 'chduration' => (int) $attrs['SHOW_DURATION'], + 'chcost' => (int) $attrs['SHOW_COST'], + 'chtask' => (int) $attrs['SHOW_TASK'], + 'chfinish' => (int) $attrs['SHOW_END'], + 'chnote' => (int) $attrs['SHOW_NOTE'], + 'chcf_1' => (int) $attrs['SHOW_CUSTOM_FIELD_1'], + 'chunits' => (int) $attrs['SHOW_WORK_UNITS'], + 'group_by1' => $attrs['GROUP_BY1'], + 'group_by2' => $attrs['GROUP_BY2'], + 'group_by3' => $attrs['GROUP_BY3'], + 'chtotalsonly' => (int) $attrs['SHOW_TOTALS_ONLY'])); + if (!$fav_report_id) $this->errors->add($i18n->get('error.db')); + } } } @@ -471,4 +611,12 @@ class ttOrgImportHelper { $group_id = $mdb2->lastInsertID('tt_groups', 'id'); return $group_id; } + + // insertMonthlyQuota - a helper function to insert a monthly quota. + private function insertMonthlyQuota($group_id, $year, $month, $minutes) { + $mdb2 = getConnection(); + $sql = "INSERT INTO tt_monthly_quotas (group_id, year, month, minutes) values ($group_id, $year, $month, $minutes)"; + $affected = $mdb2->exec($sql); + return (!is_a($affected, 'PEAR_Error')); + } }