X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/timetracker.git/blobdiff_plain/b0cd6a547ce6a16f0f26667016efce5b66211e54..67c8fa59139659b2da15c560dd10d18601ab311f:/WEB-INF/lib/ttOrgImportHelper.class.php diff --git a/WEB-INF/lib/ttOrgImportHelper.class.php b/WEB-INF/lib/ttOrgImportHelper.class.php index 6519ffae..80dc8a19 100644 --- a/WEB-INF/lib/ttOrgImportHelper.class.php +++ b/WEB-INF/lib/ttOrgImportHelper.class.php @@ -31,6 +31,10 @@ import('ttRoleHelper'); 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. @@ -52,6 +56,10 @@ class ttOrgImportHelper { var $currentGroupProjectMap = array(); var $currentGroupClientMap = array(); var $currentGroupUserMap = array(); + var $currentGroupInvoiceMap = array(); + var $currentGroupLogMap = array(); + var $currentGroupCustomFieldMap = array(); + var $currentGroupCustomFieldOptionMap = array(); // Constructor. function __construct(&$errors) { @@ -86,8 +94,23 @@ class ttOrgImportHelper { 'org_id' => $this->org_id, 'name' => $attrs['NAME'], 'currency' => $attrs['CURRENCY'], - 'lang' => $attrs['LANG'])); - // We only have 3 properties at the moment, while work is ongoing... + 'decimal_mark' => $attrs['DECIMAL_MARK'], + 'lang' => $attrs['LANG'], + 'date_format' => $attrs['DATE_FORMAT'], + 'time_format' => $attrs['TIME_FORMAT'], + 'week_start' => $attrs['WEEK_START'], + 'tracking_mode' => $attrs['TRACKING_MODE'], + 'project_required' => $attrs['PROJECT_REQUIRED'], + 'task_required' => $attrs['TASK_REQUIRED'], + 'record_type' => $attrs['RECORD_TYPE'], + 'bcc_email' => $attrs['BCC_EMAIL'], + 'allow_ip' => $attrs['ALLOW_IP'], + 'password_complexity' => $attrs['PASSWORD_COMPLEXITY'], + 'plugins' => $attrs['PLUGINS'], + 'lock_spec' => $attrs['LOCK_SPEC'], + 'workday_minutes' => $attrs['WORKDAY_MINUTES'], + 'custom_logo' => $attrs['CUSTOM_LOGO'], + 'config' => $attrs['CONFIG'])); // Special handling for top group. if (!$this->org_id && $this->current_group_id) { @@ -217,18 +240,204 @@ class ttOrgImportHelper { 'org_id' => $this->org_id, 'role_id' => $role_id, 'client_id' => $this->currentGroupClientMap[$attrs['CLIENT_ID']], - 'name' => $attrs['NAME'], // TODO: check if we need to decode all such things from htmlentities back. Refactor from the beginning if necessary. + 'name' => $attrs['NAME'], 'login' => $attrs['LOGIN'], 'password' => $attrs['PASSWORD'], 'rate' => $attrs['RATE'], 'email' => $attrs['EMAIL'], 'status' => $attrs['STATUS']), false); - // TODO: what about created_by and other audit info? if ($user_id) { // Add a mapping. $this->currentGroupUserMap[$attrs['ID']] = $user_id; } else $this->errors->add($i18n->get('error.db')); } + + if ($name == 'USER_PROJECT_BIND') { + if (!ttUserHelper::insertBind(array( + 'user_id' => $this->currentGroupUserMap[$attrs['USER_ID']], + 'project_id' => $this->currentGroupProjectMap[$attrs['PROJECT_ID']], + 'group_id' => $this->current_group_id, + 'org_id' => $this->org_id, + 'rate' => $attrs['RATE'], + 'status' => $attrs['STATUS']))) { + $this->errors->add($i18n->get('error.db')); + } + } + + if ($name == 'INVOICES') { + // If we get here, we have to recycle $currentGroupInvoiceMap. + unset($this->currentGroupInvoiceMap); + $this->currentGroupInvoiceMap = array(); + // Invoice map is reconstructed after processing elements in XML. See below. + } + + if ($name == 'INVOICE') { + // We get here when processing tags for the current group. + $invoice_id = ttInvoiceHelper::insert(array( + 'group_id' => $this->current_group_id, + 'org_id' => $this->org_id, + 'name' => $attrs['NAME'], + 'date' => $attrs['DATE'], + 'client_id' => $this->currentGroupClientMap[$attrs['CLIENT_ID']], + 'status' => $attrs['STATUS'])); + if ($invoice_id) { + // Add a mapping. + $this->currentGroupInvoiceMap[$attrs['ID']] = $invoice_id; + } else $this->errors->add($i18n->get('error.db')); + } + + if ($name == 'LOG') { + // If we get here, we have to recycle $currentGroupLogMap. + unset($this->currentGroupLogMap); + $this->currentGroupLogMap = array(); + // Log map is reconstructed after processing elements in XML. See below. + } + + if ($name == 'LOG_ITEM') { + // We get here when processing tags for the current group. + $log_item_id = ttTimeHelper::insert(array( + 'user_id' => $this->currentGroupUserMap[$attrs['USER_ID']], + 'group_id' => $this->current_group_id, + 'org_id' => $this->org_id, + 'date' => $attrs['DATE'], + 'start' => $attrs['START'], + 'finish' => $attrs['FINISH'], + 'duration' => $attrs['DURATION'], + 'client' => $this->currentGroupClientMap[$attrs['CLIENT_ID']], + 'project' => $this->currentGroupProjectMap[$attrs['PROJECT_ID']], + 'task' => $this->currentGroupTaskMap[$attrs['TASK_ID']], + 'invoice' => $this->currentGroupInvoiceMap[$attrs['INVOICE_ID']], + 'note' => (isset($attrs['COMMENT']) ? $attrs['COMMENT'] : ''), + 'billable' => $attrs['BILLABLE'], + 'paid' => $attrs['PAID'], + 'status' => $attrs['STATUS'])); + if ($log_item_id) { + // Add a mapping. + $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')); + } } } @@ -346,24 +555,22 @@ class ttOrgImportHelper { // createGroup function creates a new group. private function createGroup($fields) { - + global $user; global $i18n; $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)'; + $columns = '(parent_id, org_id, 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['decimal_mark']); $values .= ', '.$mdb2->quote($fields['lang']); -/* $values .= ', '.$mdb2->quote($fields['date_format']); $values .= ', '.$mdb2->quote($fields['time_format']); $values .= ', '.(int)$fields['week_start']; @@ -378,7 +585,7 @@ class ttOrgImportHelper { $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 .= ', now(), '.$mdb2->quote($_SERVER['REMOTE_ADDR']).', '.$mdb2->quote($user->id); $values .= ')'; $sql = 'insert into tt_groups '.$columns.$values; @@ -391,4 +598,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')); + } }