Browse Source

Import also organisations and group permissions of agents.

Martin Edenhofer 10 years ago
parent
commit
2eb413dfd0
1 changed files with 142 additions and 15 deletions
  1. 142 15
      lib/import/otrs2.rb

+ 142 - 15
lib/import/otrs2.rb

@@ -240,12 +240,22 @@ module Import::OTRS2
     priority(records)
 
     # create groups
-    records = load('Queue')
-    ticket_group(records)
+    queues = load('Queue')
+    ticket_group(queues)
+
+    # get agents groups
+    groups = load('Group')
+
+    # get agents roles
+    roles = load('Role')
 
     # create agents
-    records = load('User')
-    user(records)
+    users = load('User')
+    user(users, groups, roles, queues)
+
+    # create organizations
+    organizations = load('Customer')
+    organization(organizations)
 
     # create customers
     count = 0
@@ -259,7 +269,7 @@ module Import::OTRS2
           run = false
           next
         end
-        customer(records)
+        customer(records, organizations)
     end
 
     Thread.abort_on_exception = true
@@ -275,7 +285,6 @@ module Import::OTRS2
         steps = 20
         while run
           count += steps
-          sleep 1
           puts "loading... thread# #{thread} ..."
           offset = count-steps
           if offset != 0
@@ -288,6 +297,7 @@ module Import::OTRS2
             next
           end
           _ticket_result(records, locks)
+          sleep 1
         end
       }
     }
@@ -819,8 +829,7 @@ module Import::OTRS2
   end
 
   # sync agents
-
-  def self.user(records)
+  def self.user(records, groups, roles, queues)
 
     map = {
       :ChangeTime    => :updated_at,
@@ -838,16 +847,23 @@ module Import::OTRS2
       :UserPw        => :password,
     };
 
-    role = Role.lookup( :name => 'Agent' )
+
     records.each { |user|
       _set_valid(user)
 
+      # get roles
+      role_ids = get_roles_ids(user, groups, roles, queues)
+
+      # get groups
+      group_ids = get_queue_ids(user, groups, roles, queues)
+
       # get new attributes
       user_new = {
         :created_by_id => 1,
         :updated_by_id => 1,
         :source        => 'OTRS Import',
-        :role_ids      => [ role.id ],
+        :role_ids      => role_ids,
+        :group_ids     => group_ids,
       }
       map.each { |key,value|
         if user[key.to_s]
@@ -855,9 +871,11 @@ module Import::OTRS2
         end
       }
 
+      # set pw
       if user_new[:password]
         user_new[:password] = "{sha2}#{user_new[:password]}"
       end
+
       # check if agent already exists
       user_old = User.where( :id => user_new[:id] ).first
 
@@ -880,9 +898,56 @@ module Import::OTRS2
     }
   end
 
+  def self.get_queue_ids(user, groups, roles, queues)
+    queue_ids = []
+
+    # lookup by groups
+    user['GroupIDs'].each {|group_id, permissions|
+      queues.each {|queue_lookup|
+        if queue_lookup['GroupID'] == group_id
+          if permissions && permissions.include?('rw')
+            queue_ids.push queue_lookup['QueueID']
+          end
+        end
+      }
+    }
+
+    # lookup by roles
+
+    # roles of user
+      # groups of roles
+        # queues of group
+
+    queue_ids
+  end
+
+  def self.get_roles_ids(user, groups, roles, queues)
+    roles    = ['Agent']
+    role_ids = []
+    user['GroupIDs'].each {|group_id, permissions|
+      groups.each {|group_lookup|
+        if group_id == group_lookup['ID']
+          if group_lookup['Name'] == 'admin' && permissions && permissions.include?('rw')
+            roles.push 'Admin'
+          end
+          if group_lookup['Name'] =~ /^(stats|report)/ && permissions && ( permissions.include?('ro') || permissions.include?('rw') )
+            roles.push 'Report'
+          end
+        end
+      }
+    }
+    roles.each {|role|
+      role_lookup = Role.lookup( :name => role )
+      if role_lookup
+        role_ids.push role_lookup.id
+      end
+    }
+    role_ids
+  end
+
   # sync customers
 
-  def self.customer(records)
+  def self.customer(records, organizations)
     map = {
       :ChangeTime    => :updated_at,
       :CreateTime    => :created_at,
@@ -913,10 +978,11 @@ module Import::OTRS2
 
       # get new attributes
       user_new = {
-        :created_by_id => 1,
-        :updated_by_id => 1,
-        :source        => 'OTRS Import',
-        :role_ids      => [ role_customer.id ],
+        :created_by_id   => 1,
+        :updated_by_id   => 1,
+        :source          => 'OTRS Import',
+        :organization_id => get_organization_id(user, organizations),
+        :role_ids        => [ role_customer.id ],
       }
       map.each { |key,value|
         if user[key.to_s]
@@ -948,9 +1014,65 @@ module Import::OTRS2
     }
   end
 
+  def self.get_organization_id(user, organizations)
+    organization_id = nil
+    if user['UserCustomerID']
+      organizations.each {|organization|
+        if user['UserCustomerID'] == organization['CustomerID']
+          organization = Organization.where(:name => organization['CustomerCompanyName'] ).first
+          organization_id = organization.id
+        end
+      }
+    end
+    organization_id
+  end
+
+  # sync organizations
+
+  def self.organization(records)
+    map = {
+      :ChangeTime             => :updated_at,
+      :CreateTime             => :created_at,
+      :CreateBy               => :created_by_id,
+      :ChangeBy               => :updated_by_id,
+      :CustomerCompanyName    => :name,
+      :ValidID                => :active,
+      :CustomerCompanyComment => :note,
+    };
+
+    records.each { |organization|
+      _set_valid(organization)
+
+      # get new attributes
+      organization_new = {
+        :created_by_id => 1,
+        :updated_by_id => 1,
+      }
+      map.each { |key,value|
+        if organization[key.to_s]
+          organization_new[value] = organization[key.to_s]
+        end
+      }
+
+      # check if state already exists
+      organization_old = Organization.where( :name => organization_new[:name] ).first
+
+      # set state types
+      if organization_old
+        organization_old.update_attributes(organization_new)
+      else
+        organization = Organization.new(organization_new)
+        organization.id = organization_new[:id]
+        organization.save
+      end
+    }
+  end
+
+
   # set translate valid ids to active = true|false
 
   def self._set_valid(record)
+
       # map
       if record['ValidID'].to_s == '3'
         record['ValidID'] = '2'
@@ -964,5 +1086,10 @@ module Import::OTRS2
       if record['ValidID'].to_s == '0'
         record['ValidID'] = false
       end
+
+      # fallback
+      if !record['ValidID']
+        record['ValidID'] = true
+      end
   end
 end