ttOrgImportHelper class impoved to output conflicting login names.
authorNik Okuntseff <support@anuko.com>
Fri, 9 Nov 2018 14:25:57 +0000 (14:25 +0000)
committerNik Okuntseff <support@anuko.com>
Fri, 9 Nov 2018 14:25:57 +0000 (14:25 +0000)
31 files changed:
WEB-INF/lib/ttOrgImportHelper.class.php
WEB-INF/resources/ca.lang.php
WEB-INF/resources/cs.lang.php
WEB-INF/resources/da.lang.php
WEB-INF/resources/de.lang.php
WEB-INF/resources/en.lang.php
WEB-INF/resources/es.lang.php
WEB-INF/resources/et.lang.php
WEB-INF/resources/fa.lang.php
WEB-INF/resources/fi.lang.php
WEB-INF/resources/fr.lang.php
WEB-INF/resources/gr.lang.php
WEB-INF/resources/he.lang.php
WEB-INF/resources/hu.lang.php
WEB-INF/resources/it.lang.php
WEB-INF/resources/ja.lang.php
WEB-INF/resources/ko.lang.php
WEB-INF/resources/nl.lang.php
WEB-INF/resources/no.lang.php
WEB-INF/resources/pl.lang.php
WEB-INF/resources/pt-br.lang.php
WEB-INF/resources/pt.lang.php
WEB-INF/resources/ro.lang.php
WEB-INF/resources/ru.lang.php
WEB-INF/resources/sk.lang.php
WEB-INF/resources/sl.lang.php
WEB-INF/resources/sr.lang.php
WEB-INF/resources/sv.lang.php
WEB-INF/resources/tr.lang.php
WEB-INF/resources/zh-cn.lang.php
WEB-INF/resources/zh-tw.lang.php

index c70d258..b22c4fe 100644 (file)
 // +----------------------------------------------------------------------+
 
 import('ttUserHelper');
-import('ttProjectHelper');
-import('ttTaskHelper');
-import('ttInvoiceHelper');
-import('ttTimeHelper');
-import('ttClientHelper');
-import('ttCustomFieldHelper');
-import('ttFavReportHelper');
-import('ttExpenseHelper');
-import('ttRoleHelper');
 
 // 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 $currentElement = array(); // Current element of the XML file we are parsing.
-  var $currentTag     = '';      // XML tag of the current element.
+  var $cannotImport   = null;    // A comma-separated string of entity names that we cannot import.
+                                 // TODO: rename the above to something better.
 
   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.
@@ -71,38 +60,32 @@ class ttOrgImportHelper {
 
   // 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;
-*/
+
     // First pass. We only check user logins for potential collisions with existing.
     if ($this->firstPass) {
       if ($name == 'USER' && $this->canImport) {
-        if ('' != $attrs['STATUS'] && ttUserHelper::getUserByLogin($attrs['LOGIN'])) {
-          // We have a login collision, cannot import any data.
-          $this->canImport = false;
+        $login = $attrs['LOGIN'];
+        if ('' != $attrs['STATUS'] && ttUserHelper::getUserByLogin($login)) {
+          // We have a login collision. Append colliding login to a list of things we cannot import.
+          $this->cannotImport .= ($this->cannotImport ? ", $login" : $login);
         }
       }
-      //$this->currentTag = '';
     }
 
     // Second pass processing. We import data here, one tag at a time.
     if (!$this->firstPass && $this->canImport) {
       $mdb2 = getConnection();
 
-      // We are in second pass through the XML file and can import data.
+      // We are in second pass 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...
+          'name' => $attrs['NAME'],
+          'currency' => $attrs['CURRENCY'],
+          'lang' => $attrs['LANG']));
+        // We only have 3 properties at the moment, while work is ongoing...
 
         // Special handling for top group.
         if (!$this->org_id) {
@@ -128,8 +111,7 @@ class ttOrgImportHelper {
       if ($name == 'ROLE') {
         // We get here when processing a <role> 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();
+        $this->currentGroupRoles[$attrs['ID']] = $attrs;
       }
     }
   }
@@ -185,11 +167,13 @@ class ttOrgImportHelper {
           xml_error_string(xml_get_error_code($parser)),
           xml_get_current_line_number($parser)));
       }
-      if (!$this->canImport) {
-        $this->errors->add($i18n->get('error.user_exists'));
-        break;
-      }
     }
+    if ($this->cannotImport) {
+      $this->canImport = false;
+      $this->errors->add($i18n->get('error.user_exists'));
+      $this->errors->add(sprintf($i18n->get('error.cannot_import'), $this->cannotImport));
+    }
+
     $this->firstPass = false; // We are done with 1st pass.
     xml_parser_free($parser);
     if ($file) fclose($file);
index 64a3b86..2a74077 100644 (file)
@@ -116,6 +116,7 @@ $i18n_key_words = array(
 // 'error.goto_uncompleted' => 'Go to uncompleted entry.',
 // 'error.overlap' => 'Time interval overlaps with existing records.',
 // 'error.future_date' => 'Date is in future.',
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Iniciar sessió',
index 1cc0734..4d59374 100644 (file)
@@ -118,6 +118,7 @@ $i18n_key_words = array(
 // 'error.goto_uncompleted' => 'Go to uncompleted entry.',
 // 'error.overlap' => 'Time interval overlaps with existing records.',
 // 'error.future_date' => 'Date is in future.',
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Přihlásit',
index 280c994..914bba6 100644 (file)
@@ -108,6 +108,8 @@ $i18n_key_words = array(
 'error.goto_uncompleted' => 'Gå til uafsluttet registrering.',
 'error.overlap' => 'Tidsinterval overlapper eksisterende poster.',
 'error.future_date' => 'Datoen er ud i fremtiden.',
+// TODO: translate the following.
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Log ind',
index 48d5dcf..9e118e4 100644 (file)
@@ -101,6 +101,8 @@ $i18n_key_words = array(
 'error.goto_uncompleted' => 'Zum unvollständigen Eintrag gehen.',
 'error.overlap' => 'Der Zeitinterval überschneidet sich mit vorhandenen Einträgen.',
 'error.future_date' => 'Datum ist in der Zukunft.',
+// TODO: translate the following.
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Anmelden',
index a28c87c..16f61f2 100644 (file)
@@ -100,6 +100,7 @@ $i18n_key_words = array(
 'error.goto_uncompleted' => 'Go to uncompleted entry.',
 'error.overlap' => 'Time interval overlaps with existing records.',
 'error.future_date' => 'Date is in future.',
+'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Login',
index 28dbb50..2ee7de8 100644 (file)
@@ -114,6 +114,7 @@ $i18n_key_words = array(
 // 'error.goto_uncompleted' => 'Go to uncompleted entry.',
 // 'error.overlap' => 'Time interval overlaps with existing records.',
 // 'error.future_date' => 'Date is in future.',
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Iniciar sesion',
index 8540216..86cde2a 100644 (file)
@@ -118,6 +118,8 @@ $i18n_key_words = array(
 // 'error.goto_uncompleted' => 'Go to uncompleted entry.',
 // 'error.overlap' => 'Time interval overlaps with existing records.',
 // 'error.future_date' => 'Date is in future.',
+// TODO: translate the following.
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Login',
index d220c13..55625a8 100644 (file)
@@ -116,6 +116,7 @@ $i18n_key_words = array(
 'error.overlap' => 'بازه زمانی با سوابق موجود هم پوشانی دارد.',
 // TODO: translate the following.
 // 'error.future_date' => 'Date is in future.',
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'ورود',
index 1e4b86a..36b4d0b 100644 (file)
@@ -110,6 +110,8 @@ $i18n_key_words = array(
 'error.goto_uncompleted' => 'Siirry kesken olevaan syötteeseen.',
 'error.overlap' => 'Aikavälillä on päällekkäisiä syötteitä.',
 'error.future_date' => 'Aika on tulevaisuudessa.',
+// TODO: translate the following.
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Kirjaudu',
index 1e64e96..6290479 100644 (file)
@@ -108,6 +108,8 @@ $i18n_key_words = array(
 'error.goto_uncompleted' => 'Aller à l\\\'entrée non terminée.',
 'error.overlap' => 'Les heures des projets ne peuvent se chevaucher.',
 'error.future_date' => 'Date ultérieure.',
+// TODO: translate the following.
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Connexion',
index 1804015..f2de6f5 100644 (file)
@@ -102,6 +102,8 @@ $i18n_key_words = array(
 'error.goto_uncompleted' => 'Μεταβείτε στην μη ολοκληρωμένη καταχώρηση.',
 'error.overlap' => 'Το χρονικό διάστημα επικαλύπτει υπάρχουσες καταχωρήσεις.',
 'error.future_date' => 'Η ημερομηνία είναι στο μέλλον.',
+// TODO: translate the following.
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Σύνδεση',
index a44d82e..66cbea7 100644 (file)
@@ -126,6 +126,7 @@ $i18n_key_words = array(
 'error.overlap' => 'טווח הזמן מתנגש עם רישומים קיימים.',
 // TODO: translate the following.
 // 'error.future_date' => 'Date is in future.',
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'היכנס',
index 9e59b54..b740fe3 100644 (file)
@@ -115,6 +115,7 @@ $i18n_key_words = array(
 // 'error.goto_uncompleted' => 'Go to uncompleted entry.',
 // 'error.overlap' => 'Time interval overlaps with existing records.',
 // 'error.future_date' => 'Date is in future.',
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Bejelentkezés',
index ea2b251..5d0600a 100644 (file)
@@ -106,6 +106,8 @@ $i18n_key_words = array(
 'error.goto_uncompleted' => 'Vai alle voce incompleta.',
 'error.overlap' => 'Intervallo temporale sovrapposto a voci esistenti.',
 'error.future_date' => 'La data è nel futuro.',
+// TODO: translate the following.
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Login',
index 23afc5d..6149e7c 100644 (file)
@@ -120,6 +120,7 @@ $i18n_key_words = array(
 // 'error.goto_uncompleted' => 'Go to uncompleted entry.',
 // 'error.overlap' => 'Time interval overlaps with existing records.',
 // 'error.future_date' => 'Date is in future.',
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'ログイン',
index 6e0f59b..fa41f2c 100644 (file)
@@ -119,6 +119,7 @@ $i18n_key_words = array(
 // 'error.goto_uncompleted' => 'Go to uncompleted entry.',
 // 'error.overlap' => 'Time interval overlaps with existing records.',
 // 'error.future_date' => 'Date is in future.',
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => '로그인',
index b1f76af..8c4a524 100644 (file)
@@ -99,6 +99,8 @@ $i18n_key_words = array(
 'error.goto_uncompleted' => 'Ga naar onvolledige invoer.',
 'error.overlap' => 'De huidige registratie overlapt een reeds bestaande registratie.',
 'error.future_date' => 'Datum ligt in de toekomst.',
+// TODO: translate the following.
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Aanmelden',
index 07026ae..044a6f3 100644 (file)
@@ -120,6 +120,7 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'error.overlap' => 'Time interval overlaps with existing records.',
 // 'error.future_date' => 'Date is in future.',
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Innlogging',
index f88888f..c94ae1c 100644 (file)
@@ -112,6 +112,8 @@ $i18n_key_words = array(
 'error.goto_uncompleted' => 'Przejdź do niedokończonego wpisu.',
 'error.overlap' => 'Okres czasowy nakłada się z istniejącymi wpisami.',
 'error.future_date' => 'Data jest w przyszłości.',
+// TODO: translate the following.
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons
 'button.login' => 'Login',
index 79370ec..f40b5f0 100644 (file)
@@ -109,6 +109,8 @@ $i18n_key_words = array(
 'error.goto_uncompleted' => 'Ir até a entrada incompleta.',
 'error.overlap' => 'O intervalo se sobrepõe com entradas já existentes.',
 'error.future_date' => 'Data é no futuro.',
+// TODO: translate the following.
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Login',
index c9b24b3..4f7d748 100644 (file)
@@ -112,6 +112,7 @@ $i18n_key_words = array(
 // 'error.goto_uncompleted' => 'Go to uncompleted entry.',
 // 'error.overlap' => 'Time interval overlaps with existing records.',
 // 'error.future_date' => 'Date is in future.',
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Login',
index 2234155..82d5d3e 100644 (file)
@@ -120,6 +120,7 @@ $i18n_key_words = array(
 // 'error.goto_uncompleted' => 'Go to uncompleted entry.',
 // 'error.overlap' => 'Time interval overlaps with existing records.',
 // 'error.future_date' => 'Date is in future.',
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Autentifica',
index 4a5dbd6..3974d16 100644 (file)
@@ -99,6 +99,7 @@ $i18n_key_words = array(
 'error.goto_uncompleted' => 'Посмотреть неоконченную запись.',
 'error.overlap' => 'Интервал времени перекрывается с существующими записями.',
 'error.future_date' => 'Дата в будущем.',
+'error.cannot_import' => 'Невозможно импортировать: %s.',
 
 // Labels for buttons.
 'button.login' => 'Войти',
index 13992fe..cfca9b0 100644 (file)
@@ -115,6 +115,7 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'error.overlap' => 'Time interval overlaps with existing records.',
 // 'error.future_date' => 'Date is in future.',
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Prihlásiť',
index df5ddf5..e07b208 100644 (file)
@@ -109,6 +109,7 @@ $i18n_key_words = array(
 // 'error.goto_uncompleted' => 'Go to uncompleted entry.',
 // 'error.overlap' => 'Time interval overlaps with existing records.',
 // 'error.future_date' => 'Date is in future.',
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Prijava',
index a35014c..6bc886a 100644 (file)
@@ -109,6 +109,8 @@ $i18n_key_words = array(
 'error.goto_uncompleted' => 'Prikaži postojeći unos.',
 'error.overlap' => 'Navedeni vremenski interval se podudara sa već unetim vremenom.',
 'error.future_date' => 'Naveli ste budući datum.',
+// TODO: translate the following.
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Prijava',
index fb4289a..a646aab 100644 (file)
@@ -106,6 +106,8 @@ $i18n_key_words = array(
 'error.goto_uncompleted' => 'Visa registrering.',
 'error.overlap' => 'Tidsintervallet överlappar med en redan existerande tidsregistrering.',
 'error.future_date' => 'Det går inte att registrera tider framåt i tiden.',
+// TODO: translate the following.
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Logga in',
index 4b167e8..eb48875 100644 (file)
@@ -123,6 +123,7 @@ $i18n_key_words = array(
 // 'error.goto_uncompleted' => 'Go to uncompleted entry.',
 // 'error.overlap' => 'Time interval overlaps with existing records.',
 // 'error.future_date' => 'Date is in future.',
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => 'Giriş',
index 2d55378..e37138b 100644 (file)
@@ -112,6 +112,7 @@ $i18n_key_words = array(
 // TODO: translate the following.
 // 'error.overlap' => 'Time interval overlaps with existing records.',
 // 'error.future_date' => 'Date is in future.',
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => '登录',
index 74d379f..f46f456 100644 (file)
@@ -117,6 +117,7 @@ $i18n_key_words = array(
 // 'error.goto_uncompleted' => 'Go to uncompleted entry.',
 // 'error.overlap' => 'Time interval overlaps with existing records.',
 // 'error.future_date' => 'Date is in future.',
+// 'error.cannot_import' => 'Cannot import: %s.',
 
 // Labels for buttons.
 'button.login' => '登錄',