Merged migrations.
This commit is contained in:
parent
9bb73f3b43
commit
f7ddb4c479
30 changed files with 135 additions and 1720 deletions
|
@ -66,10 +66,12 @@ class CreateBase < ActiveRecord::Migration
|
|||
add_index :signatures, [:name], unique: true
|
||||
|
||||
create_table :email_addresses do |t|
|
||||
t.integer :channel_id, null: true
|
||||
t.string :realname, limit: 250, null: false
|
||||
t.string :email, limit: 250, null: false
|
||||
t.boolean :active, null: false, default: true
|
||||
t.string :note, limit: 250, null: true
|
||||
t.string :preferences, limit: 2000, null: true
|
||||
t.integer :updated_by_id, null: false
|
||||
t.integer :created_by_id, null: false
|
||||
t.timestamps null: false
|
||||
|
@ -419,6 +421,21 @@ class CreateBase < ActiveRecord::Migration
|
|||
end
|
||||
add_index :schedulers, [:name], unique: true
|
||||
|
||||
create_table :calendars do |t|
|
||||
t.string :name, limit: 250, null: true
|
||||
t.string :timezone, limit: 250, null: true
|
||||
t.string :business_hours, limit: 1200, null: true
|
||||
t.boolean :default, null: false, default: false
|
||||
t.string :ical_url, limit: 500, null: true
|
||||
t.text :public_holidays, limit: 500.kilobytes + 1, null: true
|
||||
t.text :last_log, limit: 500.kilobytes + 1, null: true
|
||||
t.timestamp :last_sync, null: true
|
||||
t.integer :updated_by_id, null: false
|
||||
t.integer :created_by_id, null: false
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :calendars, [:name], unique: true
|
||||
|
||||
create_table :user_devices do |t|
|
||||
t.references :user, null: false
|
||||
t.string :name, limit: 250, null: false
|
||||
|
@ -438,6 +455,12 @@ class CreateBase < ActiveRecord::Migration
|
|||
add_index :user_devices, [:updated_at]
|
||||
add_index :user_devices, [:created_at]
|
||||
|
||||
create_table :external_credentials do |t|
|
||||
t.string :name
|
||||
t.string :credentials, limit: 2500, null: false
|
||||
t.timestamps
|
||||
end
|
||||
|
||||
create_table :object_manager_attributes do |t|
|
||||
t.references :object_lookup, null: false
|
||||
t.column :name, :string, limit: 200, null: false
|
||||
|
|
|
@ -13,6 +13,7 @@ class CreateTicket < ActiveRecord::Migration
|
|||
t.references :state_type, null: false
|
||||
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 :note, :string, limit: 250, null: true
|
||||
t.column :active, :boolean, null: false, default: true
|
||||
t.column :updated_by_id, :integer, null: false
|
||||
|
@ -340,35 +341,122 @@ class CreateTicket < ActiveRecord::Migration
|
|||
|
||||
create_table :channels do |t|
|
||||
t.references :group, null: true
|
||||
t.column :adapter, :string, limit: 100, null: false
|
||||
t.column :area, :string, limit: 100, null: false
|
||||
t.column :options, :string, limit: 2000, null: true
|
||||
t.column :active, :boolean, null: false, default: true
|
||||
t.column :preferences, :string, limit: 2000, null: true
|
||||
t.column :last_log_in, :text, limit: 500.kilobytes + 1, null: true
|
||||
t.column :last_log_out, :text, limit: 500.kilobytes + 1, null: true
|
||||
t.column :status_in, :string, limit: 100, null: true
|
||||
t.column :status_out, :string, limit: 100, null: true
|
||||
t.column :updated_by_id, :integer, null: false
|
||||
t.column :created_by_id, :integer, null: false
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :channels, [:area]
|
||||
add_index :channels, [:adapter]
|
||||
|
||||
create_table :slas do |t|
|
||||
t.column :name, :string, limit: 150, null: true
|
||||
t.column :calendar_id, :integer, null: false
|
||||
t.column :first_response_time, :integer, null: true
|
||||
t.column :update_time, :integer, null: true
|
||||
t.column :close_time, :integer, null: true
|
||||
t.column :solution_time, :integer, null: true
|
||||
t.column :condition, :string, limit: 5000, null: true
|
||||
t.column :data, :string, limit: 5000, null: true
|
||||
t.column :timezone, :string, limit: 50, null: true
|
||||
t.column :active, :boolean, null: false, default: true
|
||||
t.column :updated_by_id, :integer, null: false
|
||||
t.column :created_by_id, :integer, null: false
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :slas, [:name], unique: true
|
||||
|
||||
create_table :macros do |t|
|
||||
t.string :name, limit: 250, null: true
|
||||
t.string :perform, limit: 5000, null: false
|
||||
t.boolean :active, null: false, default: true
|
||||
t.string :note, limit: 250, null: true
|
||||
t.integer :updated_by_id, null: false
|
||||
t.integer :created_by_id, null: false
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :macros, [:name], unique: true
|
||||
|
||||
create_table :chats do |t|
|
||||
t.string :name, limit: 250, null: true
|
||||
t.integer :max_queue, null: false, default: 5
|
||||
t.string :note, limit: 250, null: true
|
||||
t.boolean :active, null: false, default: true
|
||||
t.boolean :public, null: false, default: false
|
||||
t.string :preferences, limit: 5000, null: true
|
||||
t.integer :updated_by_id, null: false
|
||||
t.integer :created_by_id, null: false
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :chats, [:name], unique: true
|
||||
|
||||
create_table :chat_topics do |t|
|
||||
t.integer :chat_id, null: false
|
||||
t.string :name, limit: 250, null: false
|
||||
t.string :note, limit: 250, null: true
|
||||
t.integer :updated_by_id, null: false
|
||||
t.integer :created_by_id, null: false
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :chat_topics, [:name], unique: true
|
||||
|
||||
create_table :chat_sessions do |t|
|
||||
t.integer :chat_id, null: false
|
||||
t.string :session_id, null: false
|
||||
t.string :name, limit: 250, null: true
|
||||
t.string :state, limit: 50, null: false, default: 'waiting' # running, closed
|
||||
t.integer :user_id, null: true
|
||||
t.text :preferences, limit: 100.kilobytes + 1, null: true
|
||||
t.integer :updated_by_id, null: true
|
||||
t.integer :created_by_id, null: true
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :chat_sessions, [:session_id]
|
||||
add_index :chat_sessions, [:state]
|
||||
add_index :chat_sessions, [:user_id]
|
||||
add_index :chat_sessions, [:chat_id]
|
||||
|
||||
create_table :chat_messages do |t|
|
||||
t.integer :chat_session_id, null: false
|
||||
t.string :content, limit: 5000, null: false
|
||||
t.integer :created_by_id, null: true
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :chat_messages, [:chat_session_id]
|
||||
|
||||
create_table :chat_agents do |t|
|
||||
t.boolean :active, null: false, default: true
|
||||
t.integer :concurrent, null: false, default: 5
|
||||
t.integer :updated_by_id, null: false
|
||||
t.integer :created_by_id, null: false
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :chat_agents, [:active]
|
||||
add_index :chat_agents, [:updated_by_id], unique: true
|
||||
add_index :chat_agents, [:created_by_id], unique: true
|
||||
|
||||
create_table :report_profiles do |t|
|
||||
t.column :name, :string, limit: 150, null: true
|
||||
t.column :condition, :string, limit: 6000, null: true
|
||||
t.column :active, :boolean, null: false, default: true
|
||||
t.column :updated_by_id, :integer, null: false
|
||||
t.column :created_by_id, :integer, null: false
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :report_profiles, [:name], unique: true
|
||||
|
||||
end
|
||||
|
||||
def self.down
|
||||
drop_table :report_profiles
|
||||
drop_table :chat_topics
|
||||
drop_table :chat_sessions
|
||||
drop_table :chat_messages
|
||||
drop_table :chat_agents
|
||||
drop_table :chats
|
||||
drop_table :macros
|
||||
drop_table :slas
|
||||
drop_table :channels
|
||||
drop_table :templates_groups
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
class FacebookArticleTypes < ActiveRecord::Migration
|
||||
def up
|
||||
facebook_at = Ticket::Article::Type.find_by( name: 'facebook' )
|
||||
|
||||
return if !facebook_at
|
||||
|
||||
facebook_at.name = 'facebook feed post'
|
||||
facebook_at.save
|
||||
|
||||
Ticket::Article::Type.create(
|
||||
name: 'facebook feed comment',
|
||||
communication: true,
|
||||
updated_by_id: 1,
|
||||
created_by_id: 1
|
||||
)
|
||||
end
|
||||
end
|
|
@ -1,59 +0,0 @@
|
|||
class UpdateChannel < ActiveRecord::Migration
|
||||
def up
|
||||
|
||||
add_column :email_addresses, :channel_id, :integer, null: true
|
||||
EmailAddress.reset_column_information
|
||||
|
||||
channel_inbound = Channel.find_by(area: 'Email::Inbound')
|
||||
if channel_inbound
|
||||
EmailAddress.all.each {|email_address|
|
||||
email_address.channel_id = channel_inbound.id
|
||||
email_address.save
|
||||
}
|
||||
end
|
||||
|
||||
add_column :channels, :last_log_in, :text, limit: 500.kilobytes + 1, null: true
|
||||
add_column :channels, :last_log_out, :text, limit: 500.kilobytes + 1, null: true
|
||||
add_column :channels, :status_in, :string, limit: 100, null: true
|
||||
add_column :channels, :status_out, :string, limit: 100, null: true
|
||||
Channel.reset_column_information
|
||||
|
||||
channel_outbound = Channel.find_by(area: 'Email::Outbound', active: true)
|
||||
|
||||
Channel.all.each {|channel|
|
||||
if channel.area == 'Email::Inbound'
|
||||
channel.area = 'Email::Account'
|
||||
options = {
|
||||
inbound: {
|
||||
adapter: channel.adapter.downcase,
|
||||
options: channel.options,
|
||||
},
|
||||
outbound: {
|
||||
adapter: channel_outbound.adapter.downcase,
|
||||
options: channel_outbound.options,
|
||||
},
|
||||
}
|
||||
channel.options = options
|
||||
channel.save
|
||||
elsif channel.area == 'Email::Outbound'
|
||||
channel.area = 'Email::Notification'
|
||||
options = {
|
||||
outbound: {
|
||||
adapter: channel.adapter.downcase,
|
||||
options: channel.options,
|
||||
},
|
||||
}
|
||||
channel.options = options
|
||||
channel.save
|
||||
elsif channel.area == 'Twitter::Inbound'
|
||||
channel.area = 'Twitter::Account'
|
||||
channel.options[:adapter] = channel.adapter.downcase
|
||||
channel.save
|
||||
end
|
||||
}
|
||||
|
||||
remove_column :channels, :adapter
|
||||
Channel.reset_column_information
|
||||
|
||||
end
|
||||
end
|
|
@ -1,56 +0,0 @@
|
|||
class AddSettingOnlineService2 < ActiveRecord::Migration
|
||||
def up
|
||||
|
||||
# add preferences
|
||||
add_column :channels, :preferences, :string, limit: 2000, null: true
|
||||
Channel.reset_column_information
|
||||
Channel.where(area: 'Email::Notification').each {|channel|
|
||||
channel.preferences = {}
|
||||
channel.preferences[:online_service_disable] = true
|
||||
channel.save
|
||||
}
|
||||
Channel.where(area: 'Email::Account').each {|channel|
|
||||
next if !channel.options
|
||||
next if !channel.options[:inbound][:options]
|
||||
next if !channel.options[:inbound][:options][:host]
|
||||
next if channel.options[:inbound][:options][:host] !~ /zammad/i
|
||||
channel.preferences = {}
|
||||
channel.preferences[:online_service_disable] = true
|
||||
channel.save
|
||||
}
|
||||
|
||||
add_column :email_addresses, :preferences, :string, limit: 2000, null: true
|
||||
EmailAddress.reset_column_information
|
||||
EmailAddress.all.each {|email_address|
|
||||
next if email_address.email !~ /zammad/i
|
||||
email_address.preferences = {}
|
||||
email_address.preferences[:online_service_disable] = true
|
||||
email_address.save
|
||||
}
|
||||
|
||||
# return if it's a new setup
|
||||
return if !Setting.find_by(name: 'system_init_done')
|
||||
|
||||
Setting.create_or_update(
|
||||
title: 'Block Notifications',
|
||||
name: 'send_no_auto_response_reg_exp',
|
||||
area: 'Email::Base',
|
||||
description: 'If this regex matches, no notification will be send by the sender.',
|
||||
options: {
|
||||
form: [
|
||||
{
|
||||
display: '',
|
||||
null: false,
|
||||
name: 'send_no_auto_response_reg_exp',
|
||||
tag: 'input',
|
||||
},
|
||||
],
|
||||
},
|
||||
state: '(MAILER-DAEMON|postmaster|abuse)@.+?\..+?',
|
||||
preferences: { online_service_disable: true },
|
||||
frontend: false
|
||||
)
|
||||
|
||||
end
|
||||
|
||||
end
|
|
@ -1,10 +0,0 @@
|
|||
class UpdateMessageIdMd5 < ActiveRecord::Migration
|
||||
def up
|
||||
Ticket::Article.all.each {|article|
|
||||
next if !article.message_id
|
||||
next if article.message_id_md5
|
||||
message_id_md5 = Digest::MD5.hexdigest(article.message_id)
|
||||
article.update_columns({ message_id_md5: message_id_md5 })
|
||||
}
|
||||
end
|
||||
end
|
|
@ -1,32 +0,0 @@
|
|||
class CreateCalendar < ActiveRecord::Migration
|
||||
def up
|
||||
create_table :calendars do |t|
|
||||
t.string :name, limit: 250, null: true
|
||||
t.string :timezone, limit: 250, null: true
|
||||
t.string :business_hours, limit: 1200, null: true
|
||||
t.boolean :default, null: false, default: false
|
||||
t.string :ical_url, limit: 500, null: true
|
||||
t.text :public_holidays, limit: 500.kilobytes + 1, null: true
|
||||
t.text :last_log, limit: 500.kilobytes + 1, null: true
|
||||
t.timestamp :last_sync, null: true
|
||||
t.integer :updated_by_id, null: false
|
||||
t.integer :created_by_id, null: false
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :calendars, [:name], unique: true
|
||||
|
||||
Scheduler.create_or_update(
|
||||
name: 'Sync calendars with ical feeds.',
|
||||
method: 'Calendar.sync',
|
||||
period: 1.day,
|
||||
prio: 2,
|
||||
active: true,
|
||||
updated_by_id: 1,
|
||||
created_by_id: 1,
|
||||
)
|
||||
end
|
||||
|
||||
def down
|
||||
drop_table :calendars
|
||||
end
|
||||
end
|
|
@ -1,8 +0,0 @@
|
|||
class UpdateSla < ActiveRecord::Migration
|
||||
def up
|
||||
add_column :slas, :calendar_id, :integer, null: false
|
||||
remove_column :slas, :timezone
|
||||
remove_column :slas, :data
|
||||
remove_column :slas, :active
|
||||
end
|
||||
end
|
|
@ -1,6 +0,0 @@
|
|||
class UpdateTicketState < ActiveRecord::Migration
|
||||
def up
|
||||
add_column :ticket_states, :ignore_escalation, :boolean, null: false, default: false
|
||||
|
||||
end
|
||||
end
|
|
@ -1,123 +0,0 @@
|
|||
class UpdateSettings4 < ActiveRecord::Migration
|
||||
def up
|
||||
Setting.create_or_update(
|
||||
title: 'Authentication via Twitter',
|
||||
name: 'auth_twitter',
|
||||
area: 'Security::ThirdPartyAuthentication',
|
||||
description: "@T('Enables user authentication via twitter. Register your app first at [Twitter Developer Site](https://dev.twitter.com/apps)')",
|
||||
options: {
|
||||
form: [
|
||||
{
|
||||
display: '',
|
||||
null: true,
|
||||
name: 'auth_twitter',
|
||||
tag: 'boolean',
|
||||
options: {
|
||||
true => 'yes',
|
||||
false => 'no',
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
state: false,
|
||||
frontend: true
|
||||
)
|
||||
Setting.create_or_update(
|
||||
title: 'Authentication via Facebook',
|
||||
name: 'auth_facebook',
|
||||
area: 'Security::ThirdPartyAuthentication',
|
||||
description: "@T('Enables user authentication via Facebook. Register your app first at [Facebook Developer Site](https://developers.facebook.com/apps/)')",
|
||||
options: {
|
||||
form: [
|
||||
{
|
||||
display: '',
|
||||
null: true,
|
||||
name: 'auth_facebook',
|
||||
tag: 'boolean',
|
||||
options: {
|
||||
true => 'yes',
|
||||
false => 'no',
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
state: false,
|
||||
frontend: true
|
||||
)
|
||||
Setting.create_or_update(
|
||||
title: 'Ticket Hook Position',
|
||||
name: 'ticket_hook_position',
|
||||
area: 'Ticket::Base',
|
||||
description: "@T('The format of the subject.')
|
||||
* @T('**Right** means **Some Subject [Ticket#12345]**')
|
||||
* @T('**Left** means **[Ticket#12345] Some Subject**')
|
||||
* @T('**None** means **Some Subject** (without ticket number). In the last case you should enable *postmaster_follow_up_search_in* to recognize followups based on email headers and/or body.')",
|
||||
options: {
|
||||
form: [
|
||||
{
|
||||
display: '',
|
||||
null: true,
|
||||
name: 'ticket_hook_position',
|
||||
tag: 'select',
|
||||
options: {
|
||||
'left' => 'left',
|
||||
'right' => 'right',
|
||||
'none' => 'none',
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
state: 'right',
|
||||
frontend: false
|
||||
)
|
||||
Setting.create_or_update(
|
||||
title: 'Ticket Number Format',
|
||||
name: 'ticket_number',
|
||||
area: 'Ticket::Number',
|
||||
description: "@T('Selects the ticket number generator module.')
|
||||
* @T('**Increment** increments the ticket number, the SystemID and the counter are used with SystemID.Counter format (e.g. 1010138, 1010139).')
|
||||
* @T('With **Date** the ticket numbers will be generated by the current date, the SystemID and the counter. The format looks like Year.Month.Day.SystemID.counter (e.g. 201206231010138, 201206231010139).')
|
||||
|
||||
@T('With param 'Checksum => true' the counter will be appended as checksum to the string. The format looks like SystemID.Counter.CheckSum (e. g. 10101384, 10101392) or Year.Month.Day.SystemID.Counter.CheckSum (e.g. 2012070110101520, 2012070110101535).')",
|
||||
options: {
|
||||
form: [
|
||||
{
|
||||
display: '',
|
||||
null: true,
|
||||
name: 'ticket_number',
|
||||
tag: 'select',
|
||||
options: {
|
||||
'Ticket::Number::Increment' => 'Increment (SystemID.Counter)',
|
||||
'Ticket::Number::Date' => 'Date (Year.Month.Day.SystemID.Counter)',
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
state: 'Ticket::Number::Increment',
|
||||
frontend: false
|
||||
)
|
||||
Setting.create_or_update(
|
||||
title: 'Additional follow up detection',
|
||||
name: 'postmaster_follow_up_search_in',
|
||||
area: 'Email::Base',
|
||||
description: 'In default the follow up check is done via the subject of an email. With this setting you can add more fields where the follow up ckeck is executed.',
|
||||
options: {
|
||||
form: [
|
||||
{
|
||||
display: '',
|
||||
null: true,
|
||||
name: 'postmaster_follow_up_search_in',
|
||||
tag: 'checkbox',
|
||||
options: {
|
||||
'references' => 'References - Search for follow up also in In-Reply-To or References headers.',
|
||||
'body' => 'Body - Search for follow up also in mail body.',
|
||||
'attachment' => 'Attachment - Search for follow up also in attachments.',
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
state: [],
|
||||
frontend: false
|
||||
)
|
||||
end
|
||||
end
|
|
@ -1,222 +0,0 @@
|
|||
class UpdateOverview3 < ActiveRecord::Migration
|
||||
def up
|
||||
|
||||
# return if it's a new setup
|
||||
return if !Setting.find_by(name: 'system_init_done')
|
||||
|
||||
UserInfo.current_user_id = 1
|
||||
overview_role = Role.where( name: 'Agent' ).first
|
||||
Overview.create_or_update(
|
||||
name: 'My assigned Tickets',
|
||||
link: 'my_assigned',
|
||||
prio: 1000,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [ 1, 2, 3, 7 ],
|
||||
},
|
||||
'ticket.owner_id' => {
|
||||
operator: 'is',
|
||||
value: 'current_user.id',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group created_at),
|
||||
s: %w(title customer group created_at),
|
||||
m: %w(number title customer group created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'My pending reached Tickets',
|
||||
link: 'my_pending_reached',
|
||||
prio: 1010,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: 3,
|
||||
},
|
||||
'ticket.owner_id' => {
|
||||
operator: 'is',
|
||||
value: 'current_user.id',
|
||||
},
|
||||
'ticket.pending_time' => {
|
||||
operator: 'after (relative)',
|
||||
value: '1',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group created_at),
|
||||
s: %w(title customer group created_at),
|
||||
m: %w(number title customer group created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'Unassigned & Open Tickets',
|
||||
link: 'all_unassigned',
|
||||
prio: 1020,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [1, 2, 3],
|
||||
},
|
||||
'ticket.owner_id' => {
|
||||
operator: 'is',
|
||||
value: 1,
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group created_at),
|
||||
s: %w(title customer group created_at),
|
||||
m: %w(number title customer group created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'All Open Tickets',
|
||||
link: 'all_open',
|
||||
prio: 1030,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [1, 2, 3],
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group state owner created_at),
|
||||
s: %w(title customer group state owner created_at),
|
||||
m: %w(number title customer group state owner created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'All pending reached Tickets',
|
||||
link: 'all_pending_reached',
|
||||
prio: 1035,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [3],
|
||||
},
|
||||
'ticket.pending_time' => {
|
||||
operator: 'after (relative)',
|
||||
value: 1,
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group owner created_at),
|
||||
s: %w(title customer group owner created_at),
|
||||
m: %w(number title customer group owner created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'Escalated Tickets',
|
||||
link: 'all_escalated',
|
||||
prio: 1040,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.escalation_time' => {
|
||||
operator: 'before (relative)',
|
||||
value: 5,
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'escalation_time',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group owner escalation_time),
|
||||
s: %w(title customer group owner escalation_time),
|
||||
m: %w(number title customer group owner escalation_time),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
overview_role = Role.where( name: 'Customer' ).first
|
||||
Overview.create_or_update(
|
||||
name: 'My Tickets',
|
||||
link: 'my_tickets',
|
||||
prio: 1000,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [ 1, 2, 3, 4, 6 ],
|
||||
},
|
||||
'ticket.customer_id' => {
|
||||
operator: 'is',
|
||||
value: 'current_user.id',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'DESC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer state created_at),
|
||||
s: %w(number title state created_at),
|
||||
m: %w(number title state created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
Overview.create_or_update(
|
||||
name: 'My Organization Tickets',
|
||||
link: 'my_organization_tickets',
|
||||
prio: 1100,
|
||||
role_id: overview_role.id,
|
||||
organization_shared: true,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [ 1, 2, 3, 4, 6 ],
|
||||
},
|
||||
'ticket.organization_id' => {
|
||||
operator: 'is',
|
||||
value: 'current_user.organization_id',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'DESC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer state created_at),
|
||||
s: %w(number title customer state created_at),
|
||||
m: %w(number title customer state created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
end
|
||||
end
|
|
@ -1,5 +0,0 @@
|
|||
class UpdateSla1 < ActiveRecord::Migration
|
||||
def up
|
||||
rename_column :slas, :close_time, :solution_time
|
||||
end
|
||||
end
|
|
@ -1,28 +0,0 @@
|
|||
class UpdateSettings5 < ActiveRecord::Migration
|
||||
def up
|
||||
Setting.create_or_update(
|
||||
title: 'Geo Calendar Service',
|
||||
name: 'geo_calendar_backend',
|
||||
area: 'System::Services',
|
||||
description: 'Defines the backend for geo calendar lookups. Used for inital calendar succession.',
|
||||
options: {
|
||||
form: [
|
||||
{
|
||||
display: '',
|
||||
null: true,
|
||||
name: 'geo_calendar_backend',
|
||||
tag: 'select',
|
||||
options: {
|
||||
'' => '-',
|
||||
'Service::GeoCalendar::Zammad' => 'Zammad GeoCalendar Service',
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
state: 'Service::GeoCalendar::Zammad',
|
||||
preferences: { prio: 2 },
|
||||
frontend: false
|
||||
)
|
||||
Calendar.init_setup
|
||||
end
|
||||
end
|
|
@ -1,12 +0,0 @@
|
|||
class UpdateTicketState2 < ActiveRecord::Migration
|
||||
def up
|
||||
|
||||
return if !Ticket::State.first
|
||||
Ticket::State.create_or_update( id: 3, name: 'pending reminder', state_type_id: Ticket::StateType.find_by(name: 'pending reminder').id, ignore_escalation: true )
|
||||
Ticket::State.create_or_update( id: 4, name: 'closed', state_type_id: Ticket::StateType.find_by(name: 'closed').id, ignore_escalation: true )
|
||||
Ticket::State.create_or_update( id: 5, name: 'merged', state_type_id: Ticket::StateType.find_by(name: 'merged').id, ignore_escalation: true )
|
||||
Ticket::State.create_or_update( id: 6, name: 'removed', state_type_id: Ticket::StateType.find_by(name: 'removed').id, active: false, ignore_escalation: true )
|
||||
Ticket::State.create_or_update( id: 7, name: 'pending close', state_type_id: Ticket::StateType.find_by(name: 'pending action').id, next_state_id: 4, ignore_escalation: true )
|
||||
|
||||
end
|
||||
end
|
|
@ -1,77 +0,0 @@
|
|||
class UpdateObjectManager3 < ActiveRecord::Migration
|
||||
def up
|
||||
|
||||
ObjectManager::Attribute.add(
|
||||
force: true,
|
||||
object: 'User',
|
||||
name: 'organization_id',
|
||||
display: 'Organization',
|
||||
data_type: 'autocompletion_ajax',
|
||||
data_option: {
|
||||
multiple: false,
|
||||
nulloption: true,
|
||||
null: true,
|
||||
relation: 'Organization',
|
||||
item_class: 'formGroup--halfSize',
|
||||
},
|
||||
editable: false,
|
||||
active: true,
|
||||
screens: {
|
||||
signup: {},
|
||||
invite_agent: {},
|
||||
edit: {
|
||||
'-all-' => {
|
||||
null: true,
|
||||
},
|
||||
},
|
||||
view: {
|
||||
'-all-' => {
|
||||
shown: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
to_create: false,
|
||||
to_migrate: false,
|
||||
to_delete: false,
|
||||
position: 900,
|
||||
created_by_id: 1,
|
||||
updated_by_id: 1,
|
||||
)
|
||||
|
||||
ObjectManager::Attribute.add(
|
||||
force: true,
|
||||
object: 'Ticket',
|
||||
name: 'customer_id',
|
||||
display: 'Customer',
|
||||
data_type: 'user_autocompletion',
|
||||
data_option: {
|
||||
relation: 'User',
|
||||
autocapitalize: false,
|
||||
multiple: false,
|
||||
null: false,
|
||||
limit: 200,
|
||||
placeholder: 'Enter Person or Organization/Company',
|
||||
minLengt: 2,
|
||||
translate: false,
|
||||
},
|
||||
editable: false,
|
||||
active: true,
|
||||
screens: {
|
||||
create_top: {
|
||||
Agent: {
|
||||
null: false,
|
||||
},
|
||||
},
|
||||
edit: {},
|
||||
},
|
||||
to_create: false,
|
||||
to_migrate: false,
|
||||
to_delete: false,
|
||||
position: 10,
|
||||
created_by_id: 1,
|
||||
updated_by_id: 1,
|
||||
)
|
||||
|
||||
end
|
||||
|
||||
end
|
|
@ -1,6 +0,0 @@
|
|||
class UpdateSettings6 < ActiveRecord::Migration
|
||||
def up
|
||||
return if !Setting.column_names.include?('state')
|
||||
rename_column :settings, :state, :state_current
|
||||
end
|
||||
end
|
|
@ -1,289 +0,0 @@
|
|||
class UpdateOverview4 < ActiveRecord::Migration
|
||||
def up
|
||||
|
||||
# return if it's a new setup
|
||||
return if !Setting.find_by(name: 'system_init_done')
|
||||
|
||||
UserInfo.current_user_id = 1
|
||||
overview_role = Role.where( name: 'Agent' ).first
|
||||
Overview.create_or_update(
|
||||
name: 'My assigned Tickets',
|
||||
link: 'my_assigned',
|
||||
prio: 1000,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [ 1, 2, 3, 7 ],
|
||||
},
|
||||
'ticket.owner_id' => {
|
||||
operator: 'is',
|
||||
value: 'current_user.id',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group created_at),
|
||||
s: %w(title customer group created_at),
|
||||
m: %w(number title customer group created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'My pending reached Tickets',
|
||||
link: 'my_pending_reached',
|
||||
prio: 1010,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: 3,
|
||||
},
|
||||
'ticket.owner_id' => {
|
||||
operator: 'is',
|
||||
value: 'current_user.id',
|
||||
},
|
||||
'ticket.pending_time' => {
|
||||
operator: 'within next (relative)',
|
||||
value: 0,
|
||||
range: 'minute',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group created_at),
|
||||
s: %w(title customer group created_at),
|
||||
m: %w(number title customer group created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'Unassigned & Open Tickets',
|
||||
link: 'all_unassigned',
|
||||
prio: 1020,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [1, 2, 3],
|
||||
},
|
||||
'ticket.owner_id' => {
|
||||
operator: 'is',
|
||||
value: 1,
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group created_at),
|
||||
s: %w(title customer group created_at),
|
||||
m: %w(number title customer group created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'All Open Tickets',
|
||||
link: 'all_open',
|
||||
prio: 1030,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [1, 2, 3],
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group state owner created_at),
|
||||
s: %w(title customer group state owner created_at),
|
||||
m: %w(number title customer group state owner created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'All pending reached Tickets',
|
||||
link: 'all_pending_reached',
|
||||
prio: 1035,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [3],
|
||||
},
|
||||
'ticket.pending_time' => {
|
||||
operator: 'within next (relative)',
|
||||
value: 0,
|
||||
range: 'minute',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group owner created_at),
|
||||
s: %w(title customer group owner created_at),
|
||||
m: %w(number title customer group owner created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'Escalated Tickets',
|
||||
link: 'all_escalated',
|
||||
prio: 1040,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.escalation_time' => {
|
||||
operator: 'within next (relative)',
|
||||
value: '10',
|
||||
range: 'minute',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'escalation_time',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group owner escalation_time),
|
||||
s: %w(title customer group owner escalation_time),
|
||||
m: %w(number title customer group owner escalation_time),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
overview_role = Role.where( name: 'Customer' ).first
|
||||
Overview.create_or_update(
|
||||
name: 'My Tickets',
|
||||
link: 'my_tickets',
|
||||
prio: 1000,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [ 1, 2, 3, 4, 6, 7 ],
|
||||
},
|
||||
'ticket.customer_id' => {
|
||||
operator: 'is',
|
||||
value: 'current_user.id',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'DESC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer state created_at),
|
||||
s: %w(number title state created_at),
|
||||
m: %w(number title state created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
Overview.create_or_update(
|
||||
name: 'My Organization Tickets',
|
||||
link: 'my_organization_tickets',
|
||||
prio: 1100,
|
||||
role_id: overview_role.id,
|
||||
organization_shared: true,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [ 1, 2, 3, 4, 6, 7 ],
|
||||
},
|
||||
'ticket.organization_id' => {
|
||||
operator: 'is',
|
||||
value: 'current_user.organization_id',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'DESC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer state created_at),
|
||||
s: %w(number title customer state created_at),
|
||||
m: %w(number title customer state created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
ObjectManager::Attribute.add(
|
||||
force: true,
|
||||
object: 'Ticket',
|
||||
name: 'title',
|
||||
display: 'Title',
|
||||
data_type: 'input',
|
||||
data_option: {
|
||||
type: 'text',
|
||||
maxlength: 200,
|
||||
null: false,
|
||||
translate: false,
|
||||
},
|
||||
editable: false,
|
||||
active: true,
|
||||
screens: {
|
||||
create_top: {
|
||||
'-all-' => {
|
||||
null: false,
|
||||
},
|
||||
},
|
||||
edit: {},
|
||||
},
|
||||
to_create: false,
|
||||
to_migrate: false,
|
||||
to_delete: false,
|
||||
position: 15,
|
||||
)
|
||||
|
||||
ObjectManager::Attribute.add(
|
||||
force: true,
|
||||
object: 'Ticket',
|
||||
name: 'group_id',
|
||||
display: 'Group',
|
||||
data_type: 'select',
|
||||
data_option: {
|
||||
relation: 'Group',
|
||||
relation_condition: { access: 'rw' },
|
||||
nulloption: true,
|
||||
multiple: false,
|
||||
null: false,
|
||||
translate: false,
|
||||
},
|
||||
editable: false,
|
||||
active: true,
|
||||
screens: {
|
||||
create_middle: {
|
||||
'-all-' => {
|
||||
null: false,
|
||||
item_class: 'column',
|
||||
},
|
||||
},
|
||||
edit: {
|
||||
Agent: {
|
||||
null: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
to_create: false,
|
||||
to_migrate: false,
|
||||
to_delete: false,
|
||||
position: 25,
|
||||
)
|
||||
|
||||
end
|
||||
end
|
|
@ -1,226 +0,0 @@
|
|||
class UpdateOverview5 < ActiveRecord::Migration
|
||||
def up
|
||||
|
||||
# return if it's a new setup
|
||||
return if !Setting.find_by(name: 'system_init_done')
|
||||
|
||||
UserInfo.current_user_id = 1
|
||||
overview_role = Role.where( name: 'Agent' ).first
|
||||
Overview.create_or_update(
|
||||
name: 'My assigned Tickets',
|
||||
link: 'my_assigned',
|
||||
prio: 1000,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [ 1, 2, 3, 7 ],
|
||||
},
|
||||
'ticket.owner_id' => {
|
||||
operator: 'is',
|
||||
pre_condition: 'current_user.id',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group created_at),
|
||||
s: %w(title customer group created_at),
|
||||
m: %w(number title customer group created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'My pending reached Tickets',
|
||||
link: 'my_pending_reached',
|
||||
prio: 1010,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: 3,
|
||||
},
|
||||
'ticket.owner_id' => {
|
||||
operator: 'is',
|
||||
pre_condition: 'current_user.id',
|
||||
},
|
||||
'ticket.pending_time' => {
|
||||
operator: 'within next (relative)',
|
||||
value: 0,
|
||||
range: 'minute',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group created_at),
|
||||
s: %w(title customer group created_at),
|
||||
m: %w(number title customer group created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'Unassigned & Open Tickets',
|
||||
link: 'all_unassigned',
|
||||
prio: 1020,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [1, 2, 3],
|
||||
},
|
||||
'ticket.owner_id' => {
|
||||
operator: 'is',
|
||||
value: 1,
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group created_at),
|
||||
s: %w(title customer group created_at),
|
||||
m: %w(number title customer group created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'All Open Tickets',
|
||||
link: 'all_open',
|
||||
prio: 1030,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [1, 2, 3],
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group state owner created_at),
|
||||
s: %w(title customer group state owner created_at),
|
||||
m: %w(number title customer group state owner created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'All pending reached Tickets',
|
||||
link: 'all_pending_reached',
|
||||
prio: 1035,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [3],
|
||||
},
|
||||
'ticket.pending_time' => {
|
||||
operator: 'within next (relative)',
|
||||
value: 0,
|
||||
range: 'minute',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group owner created_at),
|
||||
s: %w(title customer group owner created_at),
|
||||
m: %w(number title customer group owner created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'Escalated Tickets',
|
||||
link: 'all_escalated',
|
||||
prio: 1040,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.escalation_time' => {
|
||||
operator: 'within next (relative)',
|
||||
value: '10',
|
||||
range: 'minute',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'escalation_time',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group owner escalation_time),
|
||||
s: %w(title customer group owner escalation_time),
|
||||
m: %w(number title customer group owner escalation_time),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
overview_role = Role.where( name: 'Customer' ).first
|
||||
Overview.create_or_update(
|
||||
name: 'My Tickets',
|
||||
link: 'my_tickets',
|
||||
prio: 1000,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [ 1, 2, 3, 4, 6, 7 ],
|
||||
},
|
||||
'ticket.customer_id' => {
|
||||
operator: 'is',
|
||||
pre_condition: 'current_user.id',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'DESC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer state created_at),
|
||||
s: %w(number title state created_at),
|
||||
m: %w(number title state created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
Overview.create_or_update(
|
||||
name: 'My Organization Tickets',
|
||||
link: 'my_organization_tickets',
|
||||
prio: 1100,
|
||||
role_id: overview_role.id,
|
||||
organization_shared: true,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [ 1, 2, 3, 4, 6, 7 ],
|
||||
},
|
||||
'ticket.organization_id' => {
|
||||
operator: 'is',
|
||||
pre_condition: 'current_user.organization_id',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'DESC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer state created_at),
|
||||
s: %w(number title customer state created_at),
|
||||
m: %w(number title customer state created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
end
|
||||
end
|
|
@ -1,37 +0,0 @@
|
|||
class CreateMacro < ActiveRecord::Migration
|
||||
def up
|
||||
create_table :macros do |t|
|
||||
t.string :name, limit: 250, null: true
|
||||
t.string :perform, limit: 5000, null: false
|
||||
t.boolean :active, null: false, default: true
|
||||
t.string :note, limit: 250, null: true
|
||||
t.integer :updated_by_id, null: false
|
||||
t.integer :created_by_id, null: false
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :macros, [:name], unique: true
|
||||
|
||||
# return if it's a new setup
|
||||
return if !Setting.find_by(name: 'system_init_done')
|
||||
|
||||
UserInfo.current_user_id = 1
|
||||
Macro.create_or_update(
|
||||
name: 'Close & Tag as Spam',
|
||||
perform: {
|
||||
'ticket.state_id' => {
|
||||
value: Ticket::State.find_by(name: 'closed').id,
|
||||
},
|
||||
'ticket.tags' => {
|
||||
operator: 'add',
|
||||
value: 'spam',
|
||||
},
|
||||
},
|
||||
note: 'example macro',
|
||||
active: true,
|
||||
)
|
||||
end
|
||||
|
||||
def down
|
||||
drop_table :macros
|
||||
end
|
||||
end
|
|
@ -1,29 +0,0 @@
|
|||
class CreateReport < ActiveRecord::Migration
|
||||
def up
|
||||
create_table :report_profiles do |t|
|
||||
t.column :name, :string, limit: 150, null: true
|
||||
t.column :condition, :string, limit: 6000, null: true
|
||||
t.column :active, :boolean, null: false, default: true
|
||||
t.column :updated_by_id, :integer, null: false
|
||||
t.column :created_by_id, :integer, null: false
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :report_profiles, [:name], unique: true
|
||||
|
||||
# return if it's a new setup
|
||||
return if !Setting.find_by(name: 'system_init_done')
|
||||
|
||||
Report::Profile.create_if_not_exists(
|
||||
name: '-all-',
|
||||
condition: {},
|
||||
active: true,
|
||||
updated_by_id: 1,
|
||||
created_by_id: 1,
|
||||
)
|
||||
Role.create_if_not_exists(name: 'Report', created_by_id: 1, updated_by_id: 1)
|
||||
end
|
||||
|
||||
def down
|
||||
drop_table :report_profiles
|
||||
end
|
||||
end
|
|
@ -1,227 +0,0 @@
|
|||
class UpdateOverview6 < ActiveRecord::Migration
|
||||
def up
|
||||
|
||||
# return if it's a new setup
|
||||
return if !Setting.find_by(name: 'system_init_done')
|
||||
|
||||
UserInfo.current_user_id = 1
|
||||
Overview.destroy_all
|
||||
overview_role = Role.where( name: 'Agent' ).first
|
||||
Overview.create_or_update(
|
||||
name: 'My assigned Tickets',
|
||||
link: 'my_assigned',
|
||||
prio: 1000,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [ 1, 2, 3, 7 ],
|
||||
},
|
||||
'ticket.owner_id' => {
|
||||
operator: 'is',
|
||||
pre_condition: 'current_user.id',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group created_at),
|
||||
s: %w(title customer group created_at),
|
||||
m: %w(number title customer group created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'Unassigned & Open',
|
||||
link: 'all_unassigned',
|
||||
prio: 1010,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [1, 2, 3],
|
||||
},
|
||||
'ticket.owner_id' => {
|
||||
operator: 'is',
|
||||
value: 1,
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group created_at),
|
||||
s: %w(title customer group created_at),
|
||||
m: %w(number title customer group created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'My pending reached Tickets',
|
||||
link: 'my_pending_reached',
|
||||
prio: 1020,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: 3,
|
||||
},
|
||||
'ticket.owner_id' => {
|
||||
operator: 'is',
|
||||
pre_condition: 'current_user.id',
|
||||
},
|
||||
'ticket.pending_time' => {
|
||||
operator: 'within next (relative)',
|
||||
value: 0,
|
||||
range: 'minute',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group created_at),
|
||||
s: %w(title customer group created_at),
|
||||
m: %w(number title customer group created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'Open',
|
||||
link: 'all_open',
|
||||
prio: 1030,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [1, 2, 3],
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group state owner created_at),
|
||||
s: %w(title customer group state owner created_at),
|
||||
m: %w(number title customer group state owner created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'Pending reached',
|
||||
link: 'all_pending_reached',
|
||||
prio: 1040,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [3],
|
||||
},
|
||||
'ticket.pending_time' => {
|
||||
operator: 'within next (relative)',
|
||||
value: 0,
|
||||
range: 'minute',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group owner created_at),
|
||||
s: %w(title customer group owner created_at),
|
||||
m: %w(number title customer group owner created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
Overview.create_or_update(
|
||||
name: 'Escalated',
|
||||
link: 'all_escalated',
|
||||
prio: 1050,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.escalation_time' => {
|
||||
operator: 'within next (relative)',
|
||||
value: '10',
|
||||
range: 'minute',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'escalation_time',
|
||||
direction: 'ASC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer group owner escalation_time),
|
||||
s: %w(title customer group owner escalation_time),
|
||||
m: %w(number title customer group owner escalation_time),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
overview_role = Role.where( name: 'Customer' ).first
|
||||
Overview.create_or_update(
|
||||
name: 'My Tickets',
|
||||
link: 'my_tickets',
|
||||
prio: 1100,
|
||||
role_id: overview_role.id,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [ 1, 2, 3, 4, 6, 7 ],
|
||||
},
|
||||
'ticket.customer_id' => {
|
||||
operator: 'is',
|
||||
pre_condition: 'current_user.id',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'DESC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer state created_at),
|
||||
s: %w(number title state created_at),
|
||||
m: %w(number title state created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
Overview.create_or_update(
|
||||
name: 'My Organization Tickets',
|
||||
link: 'my_organization_tickets',
|
||||
prio: 1200,
|
||||
role_id: overview_role.id,
|
||||
organization_shared: true,
|
||||
condition: {
|
||||
'ticket.state_id' => {
|
||||
operator: 'is',
|
||||
value: [ 1, 2, 3, 4, 6, 7 ],
|
||||
},
|
||||
'ticket.organization_id' => {
|
||||
operator: 'is',
|
||||
pre_condition: 'current_user.organization_id',
|
||||
},
|
||||
},
|
||||
order: {
|
||||
by: 'created_at',
|
||||
direction: 'DESC',
|
||||
},
|
||||
view: {
|
||||
d: %w(title customer state created_at),
|
||||
s: %w(number title customer state created_at),
|
||||
m: %w(number title customer state created_at),
|
||||
view_mode_default: 's',
|
||||
},
|
||||
)
|
||||
|
||||
end
|
||||
end
|
|
@ -1,108 +0,0 @@
|
|||
class CreateChat < ActiveRecord::Migration
|
||||
def up
|
||||
create_table :chats do |t|
|
||||
t.string :name, limit: 250, null: true
|
||||
t.integer :max_queue, null: false, default: 5
|
||||
t.string :note, limit: 250, null: true
|
||||
t.boolean :active, null: false, default: true
|
||||
t.boolean :public, null: false, default: false
|
||||
t.string :preferences, limit: 5000, null: true
|
||||
t.integer :updated_by_id, null: false
|
||||
t.integer :created_by_id, null: false
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :chats, [:name], unique: true
|
||||
|
||||
create_table :chat_topics do |t|
|
||||
t.integer :chat_id, null: false
|
||||
t.string :name, limit: 250, null: false
|
||||
t.string :note, limit: 250, null: true
|
||||
t.integer :updated_by_id, null: false
|
||||
t.integer :created_by_id, null: false
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :chat_topics, [:name], unique: true
|
||||
|
||||
create_table :chat_sessions do |t|
|
||||
t.integer :chat_id, null: false
|
||||
t.string :session_id, null: false
|
||||
t.string :name, limit: 250, null: true
|
||||
t.string :state, limit: 50, null: false, default: 'waiting' # running, closed
|
||||
t.integer :user_id, null: true
|
||||
t.text :preferences, limit: 100.kilobytes + 1, null: true
|
||||
t.integer :updated_by_id, null: true
|
||||
t.integer :created_by_id, null: true
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :chat_sessions, [:session_id]
|
||||
add_index :chat_sessions, [:state]
|
||||
add_index :chat_sessions, [:user_id]
|
||||
add_index :chat_sessions, [:chat_id]
|
||||
|
||||
create_table :chat_messages do |t|
|
||||
t.integer :chat_session_id, null: false
|
||||
t.string :content, limit: 5000, null: false
|
||||
t.integer :created_by_id, null: true
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :chat_messages, [:chat_session_id]
|
||||
|
||||
create_table :chat_agents do |t|
|
||||
t.boolean :active, null: false, default: true
|
||||
t.integer :concurrent, null: false, default: 5
|
||||
t.integer :updated_by_id, null: false
|
||||
t.integer :created_by_id, null: false
|
||||
t.timestamps null: false
|
||||
end
|
||||
add_index :chat_agents, [:active]
|
||||
add_index :chat_agents, [:updated_by_id], unique: true
|
||||
add_index :chat_agents, [:created_by_id], unique: true
|
||||
|
||||
# return if it's a new setup
|
||||
return if !Setting.find_by(name: 'system_init_done')
|
||||
|
||||
Role.create_if_not_exists(
|
||||
name: 'Chat',
|
||||
note: 'Access to chat feature.',
|
||||
updated_by_id: 1,
|
||||
created_by_id: 1
|
||||
)
|
||||
|
||||
chat = Chat.create(
|
||||
name: 'default',
|
||||
max_queue: 5,
|
||||
note: '',
|
||||
active: true,
|
||||
updated_by_id: 1,
|
||||
created_by_id: 1,
|
||||
)
|
||||
|
||||
Scheduler.create_or_update(
|
||||
name: 'Closed chat sessions where participients are offline.',
|
||||
method: 'Chat.cleanup_close',
|
||||
period: 60 * 15,
|
||||
prio: 2,
|
||||
active: true,
|
||||
updated_by_id: 1,
|
||||
created_by_id: 1,
|
||||
)
|
||||
Scheduler.create_or_update(
|
||||
name: 'Cleanup closed sessions.',
|
||||
method: 'Chat.cleanup',
|
||||
period: 5.days,
|
||||
prio: 2,
|
||||
active: true,
|
||||
updated_by_id: 1,
|
||||
created_by_id: 1,
|
||||
)
|
||||
|
||||
end
|
||||
|
||||
def down
|
||||
drop_table :chat_topics
|
||||
drop_table :chat_sessions
|
||||
drop_table :chat_messages
|
||||
drop_table :chat_agents
|
||||
drop_table :chats
|
||||
end
|
||||
end
|
|
@ -1,10 +0,0 @@
|
|||
class CreateExternalCredentials < ActiveRecord::Migration
|
||||
def change
|
||||
create_table :external_credentials do |t|
|
||||
t.string :name
|
||||
t.string :credentials, limit: 2500, null: false
|
||||
|
||||
t.timestamps null: false
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,61 +0,0 @@
|
|||
class ZendeskImportSettings < ActiveRecord::Migration
|
||||
def change
|
||||
|
||||
Setting.create_if_not_exists(
|
||||
title: 'Import Endpoint',
|
||||
name: 'import_zendesk_endpoint',
|
||||
area: 'Import::Zendesk',
|
||||
description: 'Defines Zendesk endpoint to import users, ticket, states and articles.',
|
||||
options: {
|
||||
form: [
|
||||
{
|
||||
display: '',
|
||||
null: false,
|
||||
name: 'import_zendesk_endpoint',
|
||||
tag: 'input',
|
||||
},
|
||||
],
|
||||
},
|
||||
state: 'https://yours.zendesk.com/api/v2',
|
||||
frontend: false
|
||||
)
|
||||
|
||||
Setting.create_if_not_exists(
|
||||
title: 'Import Key for requesting the Zendesk API',
|
||||
name: 'import_zendesk_endpoint_key',
|
||||
area: 'Import::Zendesk',
|
||||
description: 'Defines Zendesk endpoint auth key.',
|
||||
options: {
|
||||
form: [
|
||||
{
|
||||
display: '',
|
||||
null: false,
|
||||
name: 'import_zendesk_endpoint_key',
|
||||
tag: 'input',
|
||||
},
|
||||
],
|
||||
},
|
||||
state: '',
|
||||
frontend: false
|
||||
)
|
||||
|
||||
Setting.create_if_not_exists(
|
||||
title: 'Import User for requesting the Zendesk API',
|
||||
name: 'import_zendesk_endpoint_username',
|
||||
area: 'Import::Zendesk',
|
||||
description: 'Defines Zendesk endpoint auth key.',
|
||||
options: {
|
||||
form: [
|
||||
{
|
||||
display: '',
|
||||
null: true,
|
||||
name: 'import_zendesk_endpoint_username',
|
||||
tag: 'input',
|
||||
},
|
||||
],
|
||||
},
|
||||
state: '',
|
||||
frontend: false
|
||||
)
|
||||
end
|
||||
end
|
|
@ -1,25 +0,0 @@
|
|||
class UpdateChat5 < ActiveRecord::Migration
|
||||
def change
|
||||
|
||||
Setting.create_if_not_exists(
|
||||
title: 'Agent idle timeout',
|
||||
name: 'chat_agent_idle_timeout',
|
||||
area: 'Chat::Extended',
|
||||
description: 'Idle timeout in seconds till agent is set offline automatically.',
|
||||
options: {
|
||||
form: [
|
||||
{
|
||||
display: '',
|
||||
null: false,
|
||||
name: 'chat_agent_idle_timeout',
|
||||
tag: 'input',
|
||||
},
|
||||
],
|
||||
},
|
||||
preferences: {},
|
||||
state: '120',
|
||||
frontend: true
|
||||
)
|
||||
|
||||
end
|
||||
end
|
|
@ -1,5 +0,0 @@
|
|||
class UpdateAuth < ActiveRecord::Migration
|
||||
def up
|
||||
Setting.where(name: 'auth_otrs').destroy_all
|
||||
end
|
||||
end
|
|
@ -1,6 +0,0 @@
|
|||
class UpdtateTimeSlaTime < ActiveRecord::Migration
|
||||
def up
|
||||
return if !Ticket.column_names.include?('updtate_time_sla_time')
|
||||
rename_column :tickets, :updtate_time_sla_time, :update_time_sla_time
|
||||
end
|
||||
end
|
|
@ -1,12 +0,0 @@
|
|||
class MigrateTextModules < ActiveRecord::Migration
|
||||
def up
|
||||
TextModule.all.each {|text_module|
|
||||
text_module.content = text_module.content.text2html
|
||||
text_module.save
|
||||
}
|
||||
Signature.all.each {|signature|
|
||||
signature.body = signature.body.text2html
|
||||
signature.save
|
||||
}
|
||||
end
|
||||
end
|
|
@ -1,9 +0,0 @@
|
|||
class MigrateTextModules2 < ActiveRecord::Migration
|
||||
def up
|
||||
TextModule.all.each {|text_module|
|
||||
text_module.content.gsub!('<%=', '#{')
|
||||
text_module.content.gsub!('%>', '}')
|
||||
text_module.save
|
||||
}
|
||||
end
|
||||
end
|
13
db/seeds.rb
13
db/seeds.rb
|
@ -1174,7 +1174,7 @@ Setting.create_if_not_exists(
|
|||
},
|
||||
],
|
||||
},
|
||||
state: '(mailer-daemon|postmaster|abuse|root)@.+?\..+?',
|
||||
state: '(mailer-daemon|postmaster|abuse|root|noreply|noreply.+?)@.+?\..+?',
|
||||
preferences: { online_service_disable: true },
|
||||
frontend: false
|
||||
)
|
||||
|
@ -2425,7 +2425,7 @@ Network::Category.create_if_not_exists(
|
|||
allow_comments: true,
|
||||
network_category_type_id: Network::Category::Type.find_by(name: 'Question').id,
|
||||
network_privacy_id: Network::Privacy.find_by(name: 'logged in').id,
|
||||
# network_categories_moderator_user_ids: User.find_by(:login => '-').id,
|
||||
#network_categories_moderator_user_ids: User.find_by(:login => '-').id,
|
||||
)
|
||||
Network::Category.create_if_not_exists(
|
||||
id: 3,
|
||||
|
@ -4199,6 +4199,15 @@ Scheduler.create_or_update(
|
|||
updated_by_id: 1,
|
||||
created_by_id: 1,
|
||||
)
|
||||
Scheduler.create_or_update(
|
||||
name: 'Sync calendars with ical feeds.',
|
||||
method: 'Calendar.sync',
|
||||
period: 1.day,
|
||||
prio: 2,
|
||||
active: true,
|
||||
updated_by_id: 1,
|
||||
created_by_id: 1,
|
||||
)
|
||||
|
||||
Trigger.create_or_update(
|
||||
name: 'auto reply (on new tickets)',
|
||||
|
|
Loading…
Reference in a new issue