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
|
|
|
|
@ticket = Ticket.find(params[:id])
|
|
|
|
|
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
|
|
|
|
@ticket = Ticket.new(params[:ticket])
|
|
|
|
@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
|
|
|
|
@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-04-12 11:27:01 +00:00
|
|
|
if @ticket.update_attributes(params[:ticket])
|
|
|
|
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
|
|
|
|
@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 = {}
|
|
|
|
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
|
|
|
|
|
|
|
|
# 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-04-10 14:06:46 +00:00
|
|
|
end
|