Browse Source

Moved default and follow up state/priority from source code into model. Related to issue #689 - OTRS import breaks a lot of assumptions in Zammad.

Martin Edenhofer 8 years ago
parent
commit
c8e9058866

+ 2 - 2
app/assets/javascripts/app/controllers/customer_ticket_create.coffee

@@ -102,12 +102,12 @@ class Index extends App.ControllerContent
 
     # set prio
     if !params.priority_id
-      priority = App.TicketPriority.findByAttribute( 'name', '2 normal' )
+      priority = App.TicketPriority.findByAttribute( 'default_create', true )
       params.priority_id = priority.id
 
     # set state
     if !params.state_id
-      state = App.TicketState.findByAttribute( 'name', 'new' )
+      state = App.TicketState.findByAttribute( 'default_create', true )
       params.state_id = state.id
 
     # fillup params

+ 1 - 1
app/assets/javascripts/app/models/ticket_priority.coffee

@@ -11,4 +11,4 @@ class App.TicketPriority extends App.Model
   @configure_translate = true
   @configure_overview = [
     'name',
-  ]
+  ]

+ 0 - 3
app/controllers/first_steps_controller.rb

@@ -188,10 +188,7 @@ class FirstStepsController < ApplicationController
     ticket = Ticket.create(
       group_id: Group.find_by(active: true, name: 'Users').id,
       customer_id: customer.id,
-      owner_id: User.find_by(login: '-').id,
       title: result[:subject],
-      state_id: Ticket::State.find_by(name: 'new').id,
-      priority_id: Ticket::Priority.find_by(name: '2 normal').id,
     )
     article = Ticket::Article.create(
       ticket_id: ticket.id,

+ 0 - 2
app/controllers/form_controller.rb

@@ -98,8 +98,6 @@ class FormController < ApplicationController
       group_id: 1,
       customer_id: customer.id,
       title: params[:title],
-      state_id: Ticket::State.find_by(name: 'new').id,
-      priority_id: Ticket::Priority.find_by(name: '2 normal').id,
     )
     article = Ticket::Article.create(
       ticket_id: ticket.id,

+ 4 - 5
app/models/channel/email_parser.rb

@@ -481,10 +481,11 @@ returns
 
         end
 
-        # set ticket to open again
+        # set ticket to open again or keep create state
         if !mail['x-zammad-ticket-followup-state'.to_sym] && !mail['x-zammad-ticket-followup-state_id'.to_sym]
-          if state_type.name != 'new' && !mail['x-zammad-out-of-office'.to_sym]
-            ticket.state = Ticket::State.find_by(name: 'open')
+          new_state = Ticket::State.find_by(default_create: true)
+          if ticket.state_id != new_state.id && !mail['x-zammad-out-of-office'.to_sym]
+            ticket.state = Ticket::State.find_by(default_follow_up: true)
             ticket.save!
           end
         end
@@ -514,8 +515,6 @@ returns
         ticket = Ticket.new(
           group_id: group.id,
           title: mail[:subject] || '',
-          state_id: Ticket::State.find_by(name: 'new').id,
-          priority_id: Ticket::Priority.find_by(name: '2 normal').id,
           preferences: preferences,
         )
         set_attributes_by_x_headers(ticket, 'ticket', mail)

+ 3 - 3
app/models/observer/ticket/reset_new_state.rb

@@ -19,10 +19,10 @@ class Observer::Ticket::ResetNewState < ActiveRecord::Observer
 
     # if current ticket state is still new
     ticket = Ticket.lookup(id: record.ticket_id)
-    return true if ticket.state.state_type.name != 'new'
+    new_state = Ticket::State.find_by(default_create: true)
+    return true if ticket.state_id != new_state.id
 
-    # TODO: add config option to state managment in UI
-    state = Ticket::State.lookup(name: 'open')
+    state = Ticket::State.find_by(default_follow_up: true)
     return if !state
 
     # set ticket to open

+ 19 - 3
app/models/ticket.rb

@@ -18,13 +18,11 @@ class Ticket < ApplicationModel
   extend Ticket::Search
 
   store          :preferences
-  before_create  :check_generate, :check_defaults, :check_title, :check_escalation_update
+  before_create  :check_generate, :check_defaults, :check_title, :check_escalation_update, :set_default_state, :set_default_priority
   before_update  :check_defaults, :check_title, :reset_pending_time, :check_escalation_update
   before_destroy :destroy_dependencies
 
   validates :group_id, presence: true
-  validates :priority_id, presence: true
-  validates :state_id, presence: true
 
   activity_stream_permission 'ticket.agent'
 
@@ -925,4 +923,22 @@ result
     # destroy online notifications
     OnlineNotification.remove(self.class.to_s, id)
   end
+
+  def set_default_state
+    return if state_id
+
+    default_ticket_state = Ticket::State.find_by(default_create: true)
+    return if !default_ticket_state
+
+    self.state_id = default_ticket_state.id
+  end
+
+  def set_default_priority
+    return if priority_id
+
+    default_ticket_priority = Ticket::Priority.find_by(default_create: true)
+    return if !default_ticket_priority
+
+    self.priority_id = default_ticket_priority.id
+  end
 end

+ 29 - 0
app/models/ticket/priority.rb

@@ -2,4 +2,33 @@
 class Ticket::Priority < ApplicationModel
   self.table_name = 'ticket_priorities'
   validates :name, presence: true
+
+  after_create  :ensure_defaults
+  after_update  :ensure_defaults
+  after_destroy :ensure_defaults
+
+  attr_accessor :callback_loop
+
+  def ensure_defaults
+    return if callback_loop
+    priorities_with_default = Ticket::Priority.where(default_create: true)
+    return if priorities_with_default.count == 1
+
+    if priorities_with_default.count.zero?
+      priority = Ticket::Priority.where(active: true).order(id: :asc).first
+      priority.default_create = true
+      priority.callback_loop = true
+      priority.save!
+      return
+    end
+
+    if priorities_with_default.count > 1
+      Ticket::Priority.all.each { |local_priority|
+        next if local_priority.id == id
+        local_priority.default_create = false
+        local_priority.callback_loop = true
+        local_priority.save!
+      }
+    end
+  end
 end

+ 33 - 0
app/models/ticket/state.rb

@@ -2,10 +2,16 @@
 class Ticket::State < ApplicationModel
   include LatestChangeObserved
 
+  after_create  :ensure_defaults
+  after_update  :ensure_defaults
+  after_destroy :ensure_defaults
+
   belongs_to    :state_type, class_name: 'Ticket::StateType'
   belongs_to    :next_state, class_name: 'Ticket::State'
   validates     :name, presence: true
 
+  attr_accessor :callback_loop
+
 =begin
 
 list tickets by customer
@@ -69,4 +75,31 @@ returns:
     return true if ignore_escalation
     false
   end
+
+  def ensure_defaults
+    return if callback_loop
+
+    %w(default_create default_follow_up).each do |default_field|
+      states_with_default = Ticket::State.where(default_field => true)
+      next if states_with_default.count == 1
+
+      if states_with_default.count.zero?
+        state = Ticket::State.where(active: true).order(id: :asc).first
+        state[default_field] = true
+        state.callback_loop = true
+        state.save!
+        next
+      end
+
+      Ticket::State.all.each { |local_state|
+        next if local_state.id == id
+        next if local_state[default_field] == false
+        local_state[default_field] = false
+        local_state.callback_loop = true
+        local_state.save!
+        next
+      }
+    end
+  end
+
 end

+ 6 - 0
db/migrate/20120101000010_create_ticket.rb

@@ -14,6 +14,8 @@ class CreateTicket < ActiveRecord::Migration
       t.column :name,                 :string, limit: 250,  null: false
       t.column :next_state_id,        :integer,             null: true
       t.column :ignore_escalation,    :boolean,             null: false, default: false
+      t.column :default_create,       :boolean,             null: false, default: false
+      t.column :default_follow_up,    :boolean,             null: false, default: false
       t.column :note,                 :string, limit: 250,  null: true
       t.column :active,               :boolean,             null: false, default: true
       t.column :updated_by_id,        :integer,             null: false
@@ -21,9 +23,12 @@ class CreateTicket < ActiveRecord::Migration
       t.timestamps limit: 3, null: false
     end
     add_index :ticket_states, [:name], unique: true
+    add_index :ticket_states, [:default_create]
+    add_index :ticket_states, [:default_follow_up]
 
     create_table :ticket_priorities do |t|
       t.column :name,                 :string, limit: 250, null: false
+      t.column :default_create,       :boolean,            null: false, default: false
       t.column :note,                 :string, limit: 250, null: true
       t.column :active,               :boolean,            null: false, default: true
       t.column :updated_by_id,        :integer,            null: false
@@ -31,6 +36,7 @@ class CreateTicket < ActiveRecord::Migration
       t.timestamps limit: 3, null: false
     end
     add_index :ticket_priorities, [:name], unique: true
+    add_index :ticket_priorities, [:default_create]
 
     create_table :tickets do |t|
       t.references :group,                                                null: false

Some files were not shown because too many files changed in this diff