diff --git a/app/assets/javascripts/app/controllers/_application_controller_form.js.coffee b/app/assets/javascripts/app/controllers/_application_controller_form.js.coffee index b2d9829f6..ac52e0f0f 100644 --- a/app/assets/javascripts/app/controllers/_application_controller_form.js.coffee +++ b/app/assets/javascripts/app/controllers/_application_controller_form.js.coffee @@ -419,12 +419,21 @@ class App.ControllerForm extends App.Controller ) @delay( a, 180 ) - # radio + # working_hour else if attribute.tag is 'working_hour' if !attribute.value attribute.value = {} item = $( App.view('generic/working_hour')( attribute: attribute ) ) + # working_hour + else if attribute.tag is 'time_before_last' + if !attribute.value + attribute.value = {} + item = $( App.view('generic/time_before_last')( attribute: attribute ) ) + item.find( "[name=\"#{attribute.name}::direction\"]").find("option[value=\"#{attribute.value.direction}\"]").attr( 'selected', 'selected' ) + item.find( "[name=\"#{attribute.name}::count\"]").find("option[value=\"#{attribute.value.count}\"]").attr( 'selected', 'selected' ) + item.find( "[name=\"#{attribute.name}::area\"]").find("option[value=\"#{attribute.value.area}\"]").attr( 'selected', 'selected' ) + # ticket attribute selection else if attribute.tag is 'ticket_attribute_selection' @@ -437,6 +446,9 @@ class App.ControllerForm extends App.Controller addShownAttribute = ( key, value ) => console.log( 'addShownAttribute', key, value ) + parts = key.split(/::/) + key = parts[0] + type = parts[1] if key is 'tickets.number' attribute_config = { name: attribute.name + '::tickets.number' @@ -561,6 +573,86 @@ class App.ControllerForm extends App.Controller class: 'medium' remove: true } + else if key is 'tickets.created_at' && ( type is '<>' || value.count ) + attribute_config = { + name: attribute.name + '::tickets.created_at' + display: 'Created (before / last)' + tag: 'time_before_last' + value: value + translate: true + class: 'medium' + remove: true + } + else if key is 'tickets.created_at' && ( type is '><' || 0 ) + attribute_config = { + name: attribute.name + '::tickets.created_at' + display: 'Created (between)' + tag: 'time_range' + value: value + translate: true + class: 'medium' + remove: true + } + else if key is 'tickets.close_time' && ( type is '<>' || value.count ) + attribute_config = { + name: attribute.name + '::tickets.close_time' + display: 'Closed (before / last)' + tag: 'time_before_last' + value: value + translate: true + class: 'medium' + remove: true + } + else if key is 'tickets.close_time' && ( type is '><' || 0 ) + attribute_config = { + name: attribute.name + '::tickets.close_time' + display: 'Closed (between)' + tag: 'time_range' + value: value + translate: true + class: 'medium' + remove: true + } + else if key is 'tickets.updated_at' && ( type is '<>' || value.count ) + attribute_config = { + name: attribute.name + '::tickets.updated_at' + display: 'Updated (before / last)' + tag: 'time_before_last' + value: value + translate: true + class: 'medium' + remove: true + } + else if key is 'tickets.updated_at' && ( type is '><' || 0 ) + attribute_config = { + name: attribute.name + '::tickets.updated_at' + display: 'Updated (between)' + tag: 'time_range' + value: value + translate: true + class: 'medium' + remove: true + } + else if key is 'tickets.escalation_time' && ( type is '<>' || value.count ) + attribute_config = { + name: attribute.name + '::tickets.escalation_time' + display: 'Escalation (before / last)' + tag: 'time_before_last' + value: value + translate: true + class: 'medium' + remove: true + } + else if key is 'tickets.escalation_time' && ( type is '><' || 0 ) + attribute_config = { + name: attribute.name + '::tickets.escalation_time' + display: 'Escatlation (between)' + tag: 'time_range' + value: value + translate: true + class: 'medium' + remove: true + } else attribute_config = { name: attribute.name + '::' + key @@ -649,6 +741,54 @@ class App.ControllerForm extends App.Controller selected: true disable: false }, + { + value: 'tickets.created_at::<>' + name: 'Created (before/last)' + selected: true + disable: false + }, + { + value: 'tickets.created_at::><' + name: 'Created (between)' + selected: true + disable: false + }, + { + value: 'tickets.close_time::<>' + name: 'Closed (before/last)' + selected: true + disable: false + }, + { + value: 'tickets.close_time::><' + name: 'Closed (between)' + selected: true + disable: false + }, + { + value: 'tickets.updated_at::<>' + name: 'Updated (before/last)' + selected: true + disable: false + }, + { + value: 'tickets.updated_at::><' + name: 'Updated (between)' + selected: true + disable: false + }, + { + value: 'tickets.escalation_time::<>' + name: 'Escalation (before/last)' + selected: true + disable: false + }, + { + value: 'tickets.escalation_time::><' + name: 'Escalation (between)' + selected: true + disable: false + }, # { # value: 'tag' @@ -1057,11 +1197,18 @@ class App.ControllerForm extends App.Controller inputSelectObject = {} for key of param parts = key.split '::' - if parts[0] && parts[1] + if parts[0] && parts[1] && !parts[2] if !inputSelectObject[ parts[0] ] inputSelectObject[ parts[0] ] = {} inputSelectObject[ parts[0] ][ parts[1] ] = param[ key ] delete param[ key ] + if parts[0] && parts[1] && parts[2] + if !inputSelectObject[ parts[0] ] + inputSelectObject[ parts[0] ] = {} + if !inputSelectObject[ parts[0] ][ parts[1] ] + inputSelectObject[ parts[0] ][ parts[1] ] = {} + inputSelectObject[ parts[0] ][ parts[1] ][ parts[2] ] = param[ key ] + delete param[ key ] # check {input_select} for key of param diff --git a/app/assets/javascripts/app/models/sla.js.coffee b/app/assets/javascripts/app/models/sla.js.coffee index db0dc6a63..4aead54b4 100644 --- a/app/assets/javascripts/app/models/sla.js.coffee +++ b/app/assets/javascripts/app/models/sla.js.coffee @@ -12,7 +12,7 @@ class App.Sla extends Spine.Model name: 'data' display: 'Business Times' tag: 'working_hour' - default: { + default: Mon: true Tue: true Wed: true @@ -20,16 +20,15 @@ class App.Sla extends Spine.Model Fri: true beginning_of_workday: '8:00' end_of_workday: '18:00' - } null: true nulloption: true translate: true options: - customer: 'Customer' - ticket_state: 'State' - ticket_priority: 'Priority' - group: 'Group' - owner: 'Owner' + customer: 'Customer' + ticket_state: 'State' + ticket_priority: 'Priority' + group: 'Group' + owner: 'Owner' class: 'span4' }, { name: 'updated_at', display: 'Updated', type: 'time', readonly: 1 }, diff --git a/app/models/ticket.rb b/app/models/ticket.rb index 19fa1d3cc..6bacf891d 100644 --- a/app/models/ticket.rb +++ b/app/models/ticket.rb @@ -325,7 +325,7 @@ class Ticket < ApplicationModel overviews.each { |overview| # get count - count = Ticket.where( :group_id => group_ids ).where( overview.condition ).count() + count = Ticket.where( :group_id => group_ids ).where( self._condition( overview.condition ) ).count() # get meta info all = { @@ -348,7 +348,7 @@ class Ticket < ApplicationModel end tickets = Ticket.select( 'id' ). where( :group_id => group_ids ). - where( overview_selected.condition ). + where( self._condition( overview_selected.condition ) ). order( order_by ). limit( 500 ) @@ -358,7 +358,7 @@ class Ticket < ApplicationModel } tickets_count = Ticket.where( :group_id => group_ids ). - where( overview_selected.condition ). + where( self._condition( overview_selected.condition ) ). count() return { @@ -371,13 +371,13 @@ class Ticket < ApplicationModel # get tickets for overview data[:start_page] ||= 1 tickets = Ticket.where( :group_id => group_ids ). - where( overview_selected.condition ). - order( overview_selected[:order][:by].to_s + ' ' + overview_selected[:order][:direction].to_s ). - limit( overview_selected.view[ data[:view_mode].to_sym ][:per_page] ). - offset( overview_selected.view[ data[:view_mode].to_sym ][:per_page].to_i * ( data[:start_page].to_i - 1 ) ) + where( self._condition( overview_selected.condition ) ). + order( overview_selected[:order][:by].to_s + ' ' + overview_selected[:order][:direction].to_s )#. +# limit( overview_selected.view[ data[:view_mode].to_sym ][:per_page] ). +# offset( overview_selected.view[ data[:view_mode].to_sym ][:per_page].to_i * ( data[:start_page].to_i - 1 ) ) tickets_count = Ticket.where( :group_id => group_ids ). - where( overview_selected.condition ). + where( self._condition( overview_selected.condition ) ). count() return { @@ -387,6 +387,64 @@ class Ticket < ApplicationModel } end + def self._condition(condition) + sql = '' + bind = [nil] + condition.each {|key, value| + if sql != '' + sql += ' AND ' + end + if value.class == Array + sql += " #{key} IN (?)" + bind.push value + elsif value.class == Hash || value.class == ActiveSupport::HashWithIndifferentAccess + time = Time.now + if value['area'] == 'minute' + if value['direction'] == 'last' + time -= value['count'].to_i * 60 + else + time += value['count'].to_i * 60 + end + elsif value['area'] == 'hour' + if value['direction'] == 'last' + time -= value['count'].to_i * 60 * 60 + else + time += value['count'].to_i * 60 * 60 + end + elsif value['area'] == 'day' + if value['direction'] == 'last' + time -= value['count'].to_i * 60 * 60 * 24 + else + time += value['count'].to_i * 60 * 60 * 24 + end + elsif value['area'] == 'month' + if value['direction'] == 'last' + time -= value['count'].to_i * 60 * 60 * 24 * 31 + else + time += value['count'].to_i * 60 * 60 * 24 * 31 + end + elsif value['area'] == 'year' + if value['direction'] == 'last' + time -= value['count'].to_i * 60 * 60 * 24 * 365 + else + time += value['count'].to_i * 60 * 60 * 24 * 365 + end + end + if value['direction'] == 'last' + sql += " #{key} > ?" + bind.push time + else + sql += " #{key} < ?" + bind.push time + end + else + sql += " #{key} = ?" + bind.push value + end + } + bind[0] = sql + return bind + end def self.number_adapter diff --git a/db/seeds.rb b/db/seeds.rb index c3cc26114..aab41044f 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1295,7 +1295,7 @@ Overview.create_if_not_exists( :prio => 1010, :role_id => overview_role.id, :condition => { - 'tickets.ticket_state_id' => [1,2,3], + 'tickets.escalation_time' =>{ 'direction' => 'before', 'count'=> 5, 'area' => 'minute' }, }, :order => { :by => 'escalation_time',