tickets_controller.rb 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  1. class TicketsController < ApplicationController
  2. before_filter :authentication_check
  3. # GET /api/tickets
  4. def index
  5. @tickets = Ticket.all
  6. render :json => @tickets
  7. end
  8. # GET /api/tickets/1
  9. def show
  10. @ticket = Ticket.find( params[:id] )
  11. # permissin check
  12. return if !ticket_permission(@ticket)
  13. render :json => @ticket
  14. end
  15. # POST /api/tickets
  16. def create
  17. @ticket = Ticket.new( params[:ticket] )
  18. # check if article is given
  19. if !params[:article]
  20. render :json => 'article hash is missing', :status => :unprocessable_entity
  21. return
  22. end
  23. # create ticket
  24. if !@ticket.save
  25. render :json => @ticket.errors, :status => :unprocessable_entity
  26. return
  27. end
  28. # create tags if given
  29. if params[:tags] && !params[:tags].empty?
  30. tags = params[:tags].split /,/
  31. tags.each {|tag|
  32. Tag.tag_add(
  33. :object => 'Ticket',
  34. :o_id => @ticket.id,
  35. :item => tag,
  36. :created_by_id => current_user.id,
  37. )
  38. }
  39. end
  40. # create article if given
  41. if params[:article]
  42. form_id = params[:article][:form_id]
  43. params[:article].delete(:form_id)
  44. @article = Ticket::Article.new( params[:article] )
  45. @article.ticket_id = @ticket.id
  46. # find attachments in upload cache
  47. if form_id
  48. @article['attachments'] = Store.list(
  49. :object => 'UploadCache',
  50. :o_id => form_id,
  51. )
  52. end
  53. if !@article.save
  54. render :json => @article.errors, :status => :unprocessable_entity
  55. return
  56. end
  57. # remove attachments from upload cache
  58. if params[:form_id]
  59. Store.remove(
  60. :object => 'UploadCache',
  61. :o_id => form_id,
  62. )
  63. end
  64. end
  65. render :json => @ticket, :status => :created
  66. end
  67. # PUT /api/tickets/1
  68. def update
  69. @ticket = Ticket.find(params[:id])
  70. # permissin check
  71. return if !ticket_permission(@ticket)
  72. if @ticket.update_attributes( params[:ticket] )
  73. render :json => @ticket, :status => :ok
  74. else
  75. render :json => @ticket.errors, :status => :unprocessable_entity
  76. end
  77. end
  78. # DELETE /api/tickets/1
  79. def destroy
  80. @ticket = Ticket.find( params[:id] )
  81. # permissin check
  82. return if !ticket_permission(@ticket)
  83. @ticket.destroy
  84. head :ok
  85. end
  86. # GET /api/ticket_customer
  87. # GET /api/tickets_customer
  88. def ticket_customer
  89. # get closed/open states
  90. ticket_state_list_open = Ticket::State.where(
  91. :state_type_id => Ticket::StateType.where( :name => ['new','open', 'pending reminder', 'pending action'] )
  92. )
  93. ticket_state_list_closed = Ticket::State.where(
  94. :state_type_id => Ticket::StateType.where( :name => ['closed'] )
  95. )
  96. # get tickets
  97. tickets_open = Ticket.where(
  98. :customer_id => params[:customer_id],
  99. :ticket_state_id => ticket_state_list_open
  100. ).limit(15).order('created_at DESC')
  101. tickets_closed = Ticket.where(
  102. :customer_id => params[:customer_id],
  103. :ticket_state_id => ticket_state_list_closed
  104. ).limit(15).order('created_at DESC')
  105. # return result
  106. render :json => {
  107. :tickets => {
  108. :open => tickets_open,
  109. :closed => tickets_closed
  110. }
  111. # :users => users,
  112. }
  113. end
  114. # GET /api/ticket_history/1
  115. def ticket_history
  116. # get ticket data
  117. ticket = Ticket.find( params[:id] )
  118. # permissin check
  119. return if !ticket_permission( ticket )
  120. # get history of ticket
  121. history = History.list( 'Ticket', params[:id], 'Ticket::Article' )
  122. # get related users
  123. users = {}
  124. users[ ticket.owner_id ] = User.user_data_full( ticket.owner_id )
  125. users[ ticket.customer_id ] = User.user_data_full( ticket.customer_id )
  126. # get only needed data to send to browser
  127. history_list = []
  128. history.each do |item|
  129. users[ item[:created_by_id] ] = User.user_data_full( item[:created_by_id] )
  130. item_tmp = item.attributes
  131. if item['history_object'] == 'Ticket::Article'
  132. item_temp['type'] = 'Article ' + item['type'].to_s
  133. else
  134. item_tmp['type'] = 'Ticket ' + item['type'].to_s
  135. end
  136. item_tmp['history_type'] = item.history_type.name
  137. item_tmp['history_object'] = item.history_object.name
  138. if item.history_attribute
  139. item_tmp['history_attribute'] = item.history_attribute.name
  140. end
  141. item_tmp.delete( 'history_attribute_id' )
  142. item_tmp.delete( 'history_object_id' )
  143. item_tmp.delete( 'history_type_id' )
  144. item_tmp.delete( 'o_id' )
  145. item_tmp.delete( 'updated_at' )
  146. if item_tmp['id_to'] == nil && item_tmp['id_from'] == nil
  147. item_tmp.delete( 'id_to' )
  148. item_tmp.delete( 'id_from' )
  149. end
  150. if item_tmp['value_to'] == nil && item_tmp['value_from'] == nil
  151. item_tmp.delete( 'value_to' )
  152. item_tmp.delete( 'value_from' )
  153. end
  154. if item_tmp['related_history_object_id'] == nil
  155. item_tmp.delete( 'related_history_object_id' )
  156. end
  157. if item_tmp['related_o_id'] == nil
  158. item_tmp.delete( 'related_o_id' )
  159. end
  160. history_list.push item_tmp
  161. end
  162. # fetch meta relations
  163. history_objects = History::Object.all()
  164. history_types = History::Type.all()
  165. history_attributes = History::Attribute.all()
  166. # return result
  167. render :json => {
  168. :ticket => ticket,
  169. :users => users,
  170. :history => history_list,
  171. :history_objects => history_objects,
  172. :history_types => history_types,
  173. :history_attributes => history_attributes
  174. }
  175. end
  176. # GET /api/ticket_merge_list/1
  177. def ticket_merge_list
  178. # get closed/open states
  179. ticket_states = Ticket::State.where(
  180. :state_type_id => Ticket::StateType.where( :name => ['new','open', 'pending reminder', 'pending action', 'closed'] )
  181. )
  182. ticket = Ticket.find( params[:ticket_id] )
  183. ticket_list = Ticket.where( :customer_id => ticket.customer_id, :ticket_state_id => ticket_states )
  184. .where( 'id != ?', [ ticket.id ] )
  185. .order('created_at DESC')
  186. .limit(6)
  187. # get related users
  188. users = {}
  189. tickets = []
  190. ticket_list.each {|ticket|
  191. data = Ticket.lookup( :id => ticket.id )
  192. tickets.push data
  193. if !users[ data['owner_id'] ]
  194. users[ data['owner_id'] ] = User.user_data_full( data['owner_id'] )
  195. end
  196. if !users[ data['customer_id'] ]
  197. users[ data['customer_id'] ] = User.user_data_full( data['customer_id'] )
  198. end
  199. if !users[ data['created_by_id'] ]
  200. users[ data['created_by_id'] ] = User.user_data_full( data['created_by_id'] )
  201. end
  202. }
  203. recent_viewed = RecentView.list_fulldata( current_user, 8 )
  204. # return result
  205. render :json => {
  206. :customer => {
  207. :tickets => tickets,
  208. :users => users,
  209. },
  210. :recent => recent_viewed
  211. }
  212. end
  213. # GET /ticket_merge/1/1
  214. def ticket_merge
  215. # check master ticket
  216. ticket_master = Ticket.where( :number => params[:master_ticket_number] ).first
  217. if !ticket_master
  218. render :json => {
  219. :result => 'faild',
  220. :message => 'No such master ticket number!',
  221. }
  222. return
  223. end
  224. # permissin check
  225. return if !ticket_permission(ticket_master)
  226. # check slave ticket
  227. ticket_slave = Ticket.where( :id => params[:slave_ticket_id] ).first
  228. if !ticket_slave
  229. render :json => {
  230. :result => 'faild',
  231. :message => 'No such slave ticket!',
  232. }
  233. return
  234. end
  235. # permissin check
  236. return if !ticket_permission( ticket_slave )
  237. # check diffetent ticket ids
  238. if ticket_slave.id == ticket_master.id
  239. render :json => {
  240. :result => 'faild',
  241. :message => 'Can\'t merge ticket with it self!',
  242. }
  243. return
  244. end
  245. # merge ticket
  246. success = ticket_slave.merge_to(
  247. {
  248. :ticket_id => ticket_master.id,
  249. :created_by_id => current_user.id,
  250. }
  251. )
  252. # return result
  253. render :json => {
  254. :result => 'success',
  255. :master_ticket => ticket_master.attributes,
  256. :slave_ticket => ticket_slave.attributes,
  257. }
  258. end
  259. # GET /ticket_full/1
  260. def ticket_full
  261. # permission check
  262. ticket = Ticket.find( params[:id] )
  263. return if !ticket_permission( ticket )
  264. # get related users
  265. users = {}
  266. if !users[ticket.owner_id]
  267. users[ticket.owner_id] = User.user_data_full( ticket.owner_id )
  268. end
  269. if !users[ticket.customer_id]
  270. users[ticket.customer_id] = User.user_data_full( ticket.customer_id )
  271. end
  272. if !users[ticket.created_by_id]
  273. users[ticket.created_by_id] = User.user_data_full( ticket.created_by_id )
  274. end
  275. # log object as viewed
  276. if !params[:do_not_log] || params[:do_not_log].to_i == 0
  277. log_view( ticket )
  278. end
  279. # get signature
  280. signature = {}
  281. if ticket.group.signature
  282. signature = ticket.group.signature.attributes
  283. # replace tags
  284. signature['body'] = NotificationFactory.build(
  285. :locale => current_user.locale,
  286. :string => signature['body'],
  287. :objects => {
  288. :ticket => ticket,
  289. :user => current_user,
  290. }
  291. )
  292. end
  293. # get attributes to update
  294. attributes_to_change = Ticket.attributes_to_change( :user => current_user, :ticket => ticket )
  295. attributes_to_change[:owner_id].each { |user_id|
  296. if !users[user_id]
  297. users[user_id] = User.user_data_full( user_id )
  298. end
  299. }
  300. attributes_to_change[:group_id__owner_id].each {|group_id, user_ids|
  301. user_ids.each {|user_id|
  302. if !users[user_id]
  303. users[user_id] = User.user_data_full( user_id )
  304. end
  305. }
  306. }
  307. # get related articles
  308. ticket = ticket.attributes
  309. ticket[:article_ids] = []
  310. articles = Ticket::Article.where( :ticket_id => params[:id] )
  311. # get related users
  312. articles_used = []
  313. articles.each {|article|
  314. # ignore internal article if customer is requesting
  315. next if article.internal == true && is_role('Customer')
  316. article_tmp = article.attributes
  317. # load article ids
  318. ticket[:article_ids].push article_tmp['id']
  319. # add attachment list to article
  320. article_tmp['attachments'] = Store.list( :object => 'Ticket::Article', :o_id => article.id )
  321. # remember article
  322. articles_used.push article_tmp
  323. # load users
  324. if !users[article.created_by_id]
  325. users[article.created_by_id] = User.user_data_full( article.created_by_id )
  326. end
  327. }
  328. # return result
  329. render :json => {
  330. :ticket => ticket,
  331. :articles => articles_used,
  332. :signature => signature,
  333. :users => users,
  334. :edit_form => attributes_to_change,
  335. }
  336. end
  337. # GET /ticket_create/1
  338. def ticket_create
  339. # get attributes to update
  340. attributes_to_change = Ticket.attributes_to_change(
  341. :user => current_user,
  342. # :ticket_id => params[:ticket_id],
  343. # :article_id => params[:article_id]
  344. )
  345. users = {}
  346. attributes_to_change[:owner_id].each { |user_id|
  347. if !users[user_id]
  348. users[user_id] = User.user_data_full( user_id )
  349. end
  350. }
  351. attributes_to_change[:group_id__owner_id].each {|group_id, user_ids|
  352. user_ids.each {|user_id|
  353. if !users[user_id]
  354. users[user_id] = User.user_data_full( user_id )
  355. end
  356. }
  357. }
  358. # split data
  359. ticket = nil
  360. articles = nil
  361. if params[:ticket_id] && params[:article_id]
  362. ticket = Ticket.find( params[:ticket_id] )
  363. # get related users
  364. if !users[ticket.owner_id]
  365. users[ticket.owner_id] = User.user_data_full( ticket.owner_id )
  366. end
  367. if !users[ticket.customer_id]
  368. users[ticket.customer_id] = User.user_data_full( ticket.customer_id )
  369. end
  370. if !users[ticket.created_by_id]
  371. users[ticket.created_by_id] = User.user_data_full( ticket.created_by_id )
  372. end
  373. owner_ids = []
  374. ticket.agent_of_group.each { |user|
  375. owner_ids.push user.id
  376. if !users[user.id]
  377. users[user.id] = User.user_data_full( user.id )
  378. end
  379. }
  380. # get related articles
  381. ticket[:article_ids] = [ params[:article_id] ]
  382. article = Ticket::Article.find( params[:article_id] )
  383. # add attachment list to article
  384. article['attachments'] = Store.list( :object => 'Ticket::Article', :o_id => article.id )
  385. # load users
  386. if !users[article.created_by_id]
  387. users[article.created_by_id] = User.user_data_full( article.created_by_id )
  388. end
  389. end
  390. # return result
  391. render :json => {
  392. :ticket => ticket,
  393. :articles => [ article ],
  394. :users => users,
  395. :edit_form => attributes_to_change,
  396. }
  397. end
  398. # GET /api/tickets/search
  399. def search
  400. # build result list
  401. tickets = Ticket.search(
  402. :limit => params[:limit],
  403. :query => params[:term],
  404. :current_user => current_user,
  405. )
  406. users_data = {}
  407. ticket_result = []
  408. tickets.each do |ticket|
  409. ticket_result.push ticket.id
  410. users_data[ ticket['owner_id'] ] = User.user_data_full( ticket['owner_id'] )
  411. users_data[ ticket['customer_id'] ] = User.user_data_full( ticket['customer_id'] )
  412. users_data[ ticket['created_by_id'] ] = User.user_data_full( ticket['created_by_id'] )
  413. end
  414. # return result
  415. render :json => {
  416. :tickets => ticket_result,
  417. :users => users_data,
  418. }
  419. end
  420. end