2012-04-10 14:06:46 +00:00
class TicketsController < ApplicationController
before_filter :authentication_check
# GET /tickets
def index
@tickets = Ticket . all
2012-04-12 11:27:01 +00:00
render :json = > @tickets
2012-04-10 14:06:46 +00:00
end
# GET /tickets/1
def show
2012-11-13 10:34:45 +00:00
@ticket = Ticket . find ( params [ :id ] )
2012-04-10 14:06:46 +00:00
2012-09-04 21:28:49 +00:00
# permissin check
return if ! ticket_permission ( @ticket )
2012-04-12 11:27:01 +00:00
render :json = > @ticket
2012-04-10 14:06:46 +00:00
end
# POST /tickets
def create
2012-11-13 10:34:45 +00:00
@ticket = Ticket . new ( params [ :ticket ] )
2012-11-10 08:21:47 +00:00
@ticket . updated_by_id = current_user . id
2012-04-10 14:06:46 +00:00
@ticket . created_by_id = current_user . id
2012-04-16 11:58:15 +00:00
# check if article is given
if ! params [ :article ]
render :json = > 'article hash is missing' , :status = > :unprocessable_entity
return
end
# create ticket
if ! @ticket . save
2012-04-12 11:27:01 +00:00
render :json = > @ticket . errors , :status = > :unprocessable_entity
2012-04-16 11:58:15 +00:00
return
end
2012-10-02 05:46:08 +00:00
2012-04-16 11:58:15 +00:00
# create article if given
if params [ :article ]
@article = Ticket :: Article . new ( params [ :article ] )
@article . created_by_id = params [ :article ] [ :created_by_id ] || current_user . id
2012-11-10 08:21:47 +00:00
@article . updated_by_id = params [ :article ] [ :updated_by_id ] || current_user . id
2012-04-16 11:58:15 +00:00
@article . ticket_id = @ticket . id
2012-10-02 05:46:08 +00:00
2012-04-16 11:58:15 +00:00
# find attachments in upload cache
@article [ 'attachments' ] = Store . list (
:object = > 'UploadCache::TicketZoom::' + current_user . id . to_s ,
:o_id = > @article . ticket_id
)
if ! @article . save
render :json = > @article . errors , :status = > :unprocessable_entity
return
end
# remove attachments from upload cache
Store . remove (
:object = > 'UploadCache::TicketZoom::' + current_user . id . to_s ,
:o_id = > @article . ticket_id
)
2012-04-10 14:06:46 +00:00
end
2012-04-16 12:56:04 +00:00
2012-04-16 11:58:15 +00:00
render :json = > @ticket , :status = > :created
2012-04-10 14:06:46 +00:00
end
# PUT /tickets/1
def update
@ticket = Ticket . find ( params [ :id ] )
2012-09-04 21:28:49 +00:00
# permissin check
return if ! ticket_permission ( @ticket )
2012-11-13 10:34:45 +00:00
params [ :ticket ] [ :updated_by_id ] = current_user . id
if @ticket . update_attributes ( params [ :ticket ] )
2012-04-12 11:27:01 +00:00
render :json = > @ticket , :status = > :ok
else
render :json = > @ticket . errors , :status = > :unprocessable_entity
2012-04-10 14:06:46 +00:00
end
end
# DELETE /tickets/1
def destroy
2012-11-13 10:34:45 +00:00
@ticket = Ticket . find ( params [ :id ] )
2012-09-04 21:28:49 +00:00
# permissin check
return if ! ticket_permission ( @ticket )
2012-04-10 14:06:46 +00:00
@ticket . destroy
2012-04-12 11:27:01 +00:00
head :ok
2012-04-10 14:06:46 +00:00
end
2012-09-20 12:08:02 +00:00
# GET /ticket_customer
# GET /tickets_customer
def ticket_customer
2012-10-02 05:46:08 +00:00
2012-09-20 12:08:02 +00:00
# get closed/open states
ticket_state_list_open = Ticket :: State . where (
2012-10-02 05:46:08 +00:00
:ticket_state_type_id = > Ticket :: StateType . where ( :name = > [ 'new' , 'open' , 'pending reminder' , 'pending action' ] )
2012-09-20 12:08:02 +00:00
)
ticket_state_list_closed = Ticket :: State . where (
2012-10-02 05:46:08 +00:00
:ticket_state_type_id = > Ticket :: StateType . where ( :name = > [ 'closed' ] )
2012-09-20 12:08:02 +00:00
)
# get tickets
tickets_open = Ticket . where (
:customer_id = > params [ :customer_id ] ,
:ticket_state_id = > ticket_state_list_open
) . limit ( 15 ) . order ( 'created_at DESC' )
tickets_closed = Ticket . where (
:customer_id = > params [ :customer_id ] ,
:ticket_state_id = > ticket_state_list_closed
) . limit ( 15 ) . order ( 'created_at DESC' )
# tickets = Ticket.where(:customer_id => user_id).limit(15).order('created_at DESC')
# ticket_items = []
# tickets.each do |ticket|
# style = ''
# ticket_state_type = ticket.ticket_state.ticket_state_type.name
# if ticket_state_type == 'closed' || ticket_state_type == 'merged'
# style = 'text-decoration: line-through'
# end
# item = {
# :url => '#ticket/zoom/' + ticket.id.to_s,
# :name => 'T:' + ticket.number.to_s,
# :title => ticket.title,
# :style => style
# }
# ticket_items.push item
# end
# if ticket_items[0]
# topic = {
# :title => 'Tickets',
# :items => ticket_items
# }
# user['links'].push topic
# end
# return result
render :json = > {
:tickets = > {
:open = > tickets_open ,
:closed = > tickets_closed
}
# :users => users,
}
end
# GET /ticket_history/1
def ticket_history
# get ticket data
2012-10-02 05:46:08 +00:00
ticket = Ticket . find ( params [ :id ] )
2012-09-20 12:08:02 +00:00
# permissin check
2012-10-02 05:46:08 +00:00
return if ! ticket_permission ( ticket )
2012-09-20 12:08:02 +00:00
# get history of ticket
history = History . history_list ( 'Ticket' , params [ :id ] , 'Ticket::Article' )
# get related users
users = { }
2012-10-05 07:10:14 +00:00
users [ ticket . owner_id ] = User . user_data_full ( ticket . owner_id )
users [ ticket . customer_id ] = User . user_data_full ( ticket . customer_id )
2012-09-20 12:08:02 +00:00
history . each do | item |
users [ item [ 'created_by_id' ] ] = User . user_data_full ( item [ 'created_by_id' ] )
if item [ 'history_object' ] == 'Ticket::Article'
item [ 'type' ] = 'Article ' + item [ 'type' ] . to_s
else
item [ 'type' ] = 'Ticket ' + item [ 'type' ] . to_s
end
end
# fetch meta relations
history_objects = History :: Object . all ( )
history_types = History :: Type . all ( )
history_attributes = History :: Attribute . all ( )
# return result
render :json = > {
:ticket = > ticket ,
:users = > users ,
:history = > history ,
:history_objects = > history_objects ,
:history_types = > history_types ,
:history_attributes = > history_attributes
}
end
2012-10-18 19:23:05 +00:00
# GET /ticket_merge_list/1
def ticket_merge_list
# get closed/open states
ticket_states = Ticket :: State . where (
:ticket_state_type_id = > Ticket :: StateType . where ( :name = > [ 'new' , 'open' , 'pending reminder' , 'pending action' , 'closed' ] )
)
ticket = Ticket . find ( params [ :ticket_id ] )
2012-10-22 15:38:30 +00:00
ticket_list = Ticket . where ( :customer_id = > ticket . customer_id , :ticket_state_id = > ticket_states )
. where ( 'id != ?' , [ ticket . id ] )
. order ( 'created_at DESC' )
. limit ( 6 )
2012-10-18 19:23:05 +00:00
# get related users
users = { }
tickets = [ ]
ticket_list . each { | ticket |
data = Ticket . full_data ( ticket . id )
tickets . push data
if ! users [ data [ 'owner_id' ] ]
users [ data [ 'owner_id' ] ] = User . user_data_full ( data [ 'owner_id' ] )
end
if ! users [ data [ 'customer_id' ] ]
users [ data [ 'customer_id' ] ] = User . user_data_full ( data [ 'customer_id' ] )
end
if ! users [ data [ 'created_by_id' ] ]
users [ data [ 'created_by_id' ] ] = User . user_data_full ( data [ 'created_by_id' ] )
end
}
2012-10-18 19:39:59 +00:00
recent_viewed = History . recent_viewed_fulldata ( current_user , 8 )
2012-10-18 19:23:05 +00:00
# return result
render :json = > {
:customer = > {
:tickets = > tickets ,
:users = > users ,
} ,
:recent = > recent_viewed
}
end
2012-09-20 12:08:02 +00:00
# GET /ticket_merge/1/1
def ticket_merge
# check master ticket
ticket_master = Ticket . where ( :number = > params [ :master_ticket_number ] ) . first
if ! ticket_master
render :json = > {
:result = > 'faild' ,
:message = > 'No such master ticket number!' ,
}
return
end
# permissin check
return if ! ticket_permission ( ticket_master )
# check slave ticket
ticket_slave = Ticket . where ( :id = > params [ :slave_ticket_id ] ) . first
if ! ticket_slave
render :json = > {
:result = > 'faild' ,
:message = > 'No such slave ticket!' ,
}
return
end
# permissin check
2012-10-02 05:46:08 +00:00
return if ! ticket_permission ( ticket_slave )
2012-09-20 12:08:02 +00:00
# check diffetent ticket ids
if ticket_slave . id == ticket_master . id
render :json = > {
:result = > 'faild' ,
:message = > 'Can\'t merge ticket with it self!' ,
}
return
end
# merge ticket
success = ticket_slave . merge_to (
{
:ticket_id = > ticket_master . id ,
:created_by_id = > current_user . id ,
}
)
# return result
render :json = > {
:result = > 'success' ,
:master_ticket = > ticket_master . attributes ,
:slave_ticket = > ticket_slave . attributes ,
}
end
# GET /ticket_full/1
def ticket_full
# permission check
2012-10-02 05:46:08 +00:00
ticket = Ticket . find ( params [ :id ] )
return if ! ticket_permission ( ticket )
2012-09-20 12:08:02 +00:00
# get related users
users = { }
if ! users [ ticket . owner_id ]
2012-10-02 05:46:08 +00:00
users [ ticket . owner_id ] = User . user_data_full ( ticket . owner_id )
2012-09-20 12:08:02 +00:00
end
if ! users [ ticket . customer_id ]
2012-10-02 05:46:08 +00:00
users [ ticket . customer_id ] = User . user_data_full ( ticket . customer_id )
2012-09-20 12:08:02 +00:00
end
if ! users [ ticket . created_by_id ]
2012-10-02 05:46:08 +00:00
users [ ticket . created_by_id ] = User . user_data_full ( ticket . created_by_id )
2012-09-20 12:08:02 +00:00
end
owner_ids = [ ]
ticket . agent_of_group . each { | user |
owner_ids . push user . id
if ! users [ user . id ]
2012-10-02 05:46:08 +00:00
users [ user . id ] = User . user_data_full ( user . id )
2012-09-20 12:08:02 +00:00
end
}
# log object as viewed
2012-10-02 05:46:08 +00:00
log_view ( ticket )
# get signature
2012-10-03 19:45:04 +00:00
signature = { }
if ticket . group . signature
signature = ticket . group . signature . attributes
# replace tags
signature [ 'body' ] = NotificationFactory . build (
:string = > signature [ 'body' ] ,
:objects = > {
:ticket = > ticket ,
:user = > current_user ,
}
)
end
2012-09-20 12:08:02 +00:00
# get related articles
ticket = ticket . attributes
ticket [ :article_ids ] = [ ]
articles = Ticket :: Article . where ( :ticket_id = > params [ :id ] )
# get related users
articles_used = [ ]
articles . each { | article |
# ignore internal article if customer is requesting
next if article . internal == true && is_role ( 'Customer' )
article_tmp = article . attributes
# load article ids
ticket [ :article_ids ] . push article_tmp [ 'id' ]
# add attachment list to article
article_tmp [ 'attachments' ] = Store . list ( :object = > 'Ticket::Article' , :o_id = > article . id )
# remember article
articles_used . push article_tmp
# load users
if ! users [ article . created_by_id ]
2012-10-02 05:46:08 +00:00
users [ article . created_by_id ] = User . user_data_full ( article . created_by_id )
2012-09-20 12:08:02 +00:00
end
}
# get groups
group_ids = [ ]
Group . where ( :active = > true ) . each { | group |
group_ids . push group . id
}
agents = { }
Ticket . agents . each { | user |
agents [ user . id ] = 1
}
groups_users = { }
group_ids . each { | group_id |
groups_users [ group_id ] = [ ]
Group . find ( group_id ) . users . each { | user |
next if ! agents [ user . id ]
groups_users [ group_id ] . push user . id
if ! users [ user . id ]
2012-10-02 05:46:08 +00:00
users [ user . id ] = User . user_data_full ( user . id )
2012-09-20 12:08:02 +00:00
end
}
}
# return result
render :json = > {
2012-10-02 05:46:08 +00:00
:ticket = > ticket ,
:articles = > articles_used ,
:signature = > signature ,
:users = > users ,
2012-09-20 12:08:02 +00:00
:edit_form = > {
:group_id__owner_id = > groups_users ,
:owner_id = > owner_ids ,
}
}
end
# GET /ticket_create/1
def ticket_create
# get attributes
create_attributes = Ticket . create_attributes (
:current_user_id = > current_user . id ,
)
# split data
ticket = nil
articles = nil
users = { }
if params [ :ticket_id ] && params [ :article_id ]
ticket = Ticket . find ( params [ :ticket_id ] )
# get related users
if ! users [ ticket . owner_id ]
2012-10-02 05:46:08 +00:00
users [ ticket . owner_id ] = User . user_data_full ( ticket . owner_id )
2012-09-20 12:08:02 +00:00
end
if ! users [ ticket . customer_id ]
2012-10-02 05:46:08 +00:00
users [ ticket . customer_id ] = User . user_data_full ( ticket . customer_id )
2012-09-20 12:08:02 +00:00
end
if ! users [ ticket . created_by_id ]
2012-10-02 05:46:08 +00:00
users [ ticket . created_by_id ] = User . user_data_full ( ticket . created_by_id )
2012-09-20 12:08:02 +00:00
end
owner_ids = [ ]
ticket . agent_of_group . each { | user |
owner_ids . push user . id
if ! users [ user . id ]
2012-10-02 05:46:08 +00:00
users [ user . id ] = User . user_data_full ( user . id )
2012-09-20 12:08:02 +00:00
end
}
# get related articles
ticket [ :article_ids ] = [ params [ :article_id ] ]
article = Ticket :: Article . find ( params [ :article_id ] )
# add attachment list to article
article [ 'attachments' ] = Store . list ( :object = > 'Ticket::Article' , :o_id = > article . id )
# load users
if ! users [ article . created_by_id ]
2012-10-02 05:46:08 +00:00
users [ article . created_by_id ] = User . user_data_full ( article . created_by_id )
2012-09-20 12:08:02 +00:00
end
end
create_attributes [ :owner_id ] . each { | user_id |
if ! users [ user_id ]
2012-10-02 05:46:08 +00:00
users [ user_id ] = User . user_data_full ( user_id )
2012-09-20 12:08:02 +00:00
end
}
# return result
render :json = > {
:ticket = > ticket ,
:articles = > [ article ] ,
:users = > users ,
:edit_form = > create_attributes ,
}
end
2012-11-14 01:05:53 +00:00
# GET /api/tickets/search
def search
# get params
query = params [ :term ]
limit = params [ :limit ] || 15
2012-11-14 01:21:44 +00:00
conditions = [ ]
if current_user . is_role ( 'Agent' )
group_ids = Group . select ( 'groups.id' ) . joins ( :users ) .
where ( 'groups_users.user_id = ?' , current_user . id ) .
where ( 'groups.active = ?' , true ) .
map ( & :id )
conditions = [ 'group_id IN (?)' , group_ids ]
else
if ! current_user . organization || ! current_user . organization . shared
conditions = [ 'customer_id = ?' , current_user . id ]
else
conditions = [ '( customer_id = ? OR organization_id = ? )' , current_user . id , current_user . organization . shared ]
end
end
2012-11-14 01:05:53 +00:00
# do query
2012-11-14 01:48:04 +00:00
tickets_all = Ticket . select ( 'DISTINCT(tickets.id)' ) .
where ( conditions ) .
2012-11-14 01:38:11 +00:00
where ( '( title LIKE ? OR number LIKE ? OR ticket_articles.body LIKE ? OR ticket_articles.from LIKE ? OR ticket_articles.to LIKE ? OR ticket_articles.subject LIKE ?)' , " % #{ query } % " , " % #{ query } % " , " % #{ query } % " , " % #{ query } % " , " % #{ query } % " , " % #{ query } % " ) .
2012-11-14 01:48:04 +00:00
joins ( :articles ) .
2012-11-14 01:38:11 +00:00
limit ( limit ) .
2012-11-14 01:48:04 +00:00
order ( 'tickets.created_at DESC' )
2012-11-14 01:05:53 +00:00
# build result list
tickets = [ ]
users = { }
tickets_all . each do | ticket |
ticket_tmp = Ticket . full_data ( ticket . id )
tickets . push ticket_tmp
2012-11-14 01:48:04 +00:00
users [ ticket [ 'owner_id' ] ] = User . user_data_full ( ticket_tmp [ 'owner_id' ] )
users [ ticket [ 'customer_id' ] ] = User . user_data_full ( ticket_tmp [ 'customer_id' ] )
users [ ticket [ 'created_by_id' ] ] = User . user_data_full ( ticket_tmp [ 'created_by_id' ] )
2012-11-14 01:05:53 +00:00
end
# return result
render :json = > {
:tickets = > tickets ,
:users = > users ,
}
end
2012-04-10 14:06:46 +00:00
end