ical_tickets_controller.rb 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. # Copyright (C) 2012-2015 Zammad Foundation, http://zammad-foundation.org/
  2. require 'icalendar'
  3. class IcalTicketsController < ApplicationController
  4. before_action { authentication_check_action_token 'iCal' }
  5. # @path [GET] /ical/tickets_all/:action_token
  6. #
  7. # @summary Returns an iCal file with all tickets (open, new, pending, esclation) as events.
  8. #
  9. # @parameter action_token(required) [String] The action_token identifying the requested User privileged for 'iCal' action.
  10. #
  11. # @response_message 200 [String] iCal file ready to import in calendar applications.
  12. # @response_message 401 Permission denied.
  13. def all
  14. new_open_events_data = new_open_events_data_get
  15. pending_events_data = pending_events_data_get
  16. escalation_events_data = escalation_events_data_get
  17. events_data = new_open_events_data + pending_events_data + escalation_events_data
  18. events_data_to_ical( events_data )
  19. end
  20. # @path [GET] /ical/tickets_new_open/:action_token
  21. #
  22. # @summary Returns an iCal file with all new and open tickets as events.
  23. #
  24. # @parameter action_token(required) [String] The action_token identifying the requested User privileged for 'iCal' action.
  25. #
  26. # @response_message 200 [String] iCal file ready to import in calendar applications.
  27. # @response_message 401 Permission denied.
  28. def new_open
  29. events_data = new_open_events_data_get
  30. events_data_to_ical( events_data )
  31. end
  32. # @path [GET] /ical/tickets_pending/:action_token
  33. #
  34. # @summary Returns an iCal file with all pending tickets as events.
  35. #
  36. # @parameter action_token(required) [String] The action_token identifying the requested User privileged for 'iCal' action.
  37. #
  38. # @response_message 200 [String] iCal file ready to import in calendar applications.
  39. # @response_message 401 Permission denied.
  40. def pending
  41. events_data = pending_events_data_get
  42. events_data_to_ical( events_data )
  43. end
  44. # @path [GET] /ical/ticket_escalation/:action_token
  45. #
  46. # @summary Returns an iCal file with all escalation times for tickets as events.
  47. #
  48. # @parameter action_token(required) [String] The action_token identifying the requested User privileged for 'iCal' action.
  49. #
  50. # @response_message 200 [String] iCal file ready to import in calendar applications.
  51. # @response_message 401 Permission denied.
  52. def escalation
  53. events_data = escalation_events_data_get
  54. events_data_to_ical( events_data )
  55. end
  56. private
  57. def new_open_events_data_get
  58. condition = {
  59. 'tickets.owner_id' => current_user.id,
  60. 'tickets.state_id' => Ticket::State.where(
  61. state_type_id: Ticket::StateType.where(
  62. name: %w(new open),
  63. ),
  64. ),
  65. }
  66. tickets = Ticket.search(
  67. current_user: current_user,
  68. condition: condition,
  69. )
  70. events_data = []
  71. tickets.each do |ticket|
  72. event_data = {}
  73. event_data[:dtstart] = Icalendar::Values::Date.new( Time.zone.today )
  74. event_data[:dtend] = Icalendar::Values::Date.new( Time.zone.today )
  75. event_data[:summary] = "#{ ticket.state.name } ticket: '#{ ticket.title }'"
  76. event_data[:description] = "T##{ ticket.number }"
  77. events_data.push event_data
  78. end
  79. events_data
  80. end
  81. def pending_events_data_get
  82. condition = {
  83. 'tickets.owner_id' => current_user.id,
  84. 'tickets.state_id' => Ticket::State.where(
  85. state_type_id: Ticket::StateType.where(
  86. name: [
  87. 'pending reminder',
  88. 'pending action',
  89. ],
  90. ),
  91. ),
  92. }
  93. tickets = Ticket.search(
  94. current_user: current_user,
  95. condition: condition,
  96. )
  97. events_data = []
  98. tickets.each do |ticket|
  99. event_data = {}
  100. # rubocop:disable Rails/TimeZone
  101. event_data[:dtstart] = Icalendar::Values::DateTime.new( ticket.pending_time )
  102. event_data[:dtend] = Icalendar::Values::DateTime.new( ticket.pending_time )
  103. # rubocop:enable Rails/TimeZone
  104. event_data[:summary] = "#{ ticket.state.name } ticket: '#{ ticket.title }'"
  105. event_data[:description] = "T##{ ticket.number }"
  106. events_data.push event_data
  107. end
  108. events_data
  109. end
  110. def escalation_events_data_get
  111. condition = [
  112. 'tickets.escalation_time IS NOT NULL',
  113. 'tickets.owner_id = ?', current_user.id
  114. ]
  115. tickets = Ticket.search(
  116. current_user: current_user,
  117. condition: condition,
  118. )
  119. events_data = []
  120. tickets.each do |ticket|
  121. event_data = {}
  122. # rubocop:disable Rails/TimeZone
  123. event_data[:dtstart] = Icalendar::Values::DateTime.new( ticket.escalation_time )
  124. event_data[:dtend] = Icalendar::Values::DateTime.new( ticket.escalation_time )
  125. # rubocop:enable Rails/TimeZone
  126. event_data[:summary] = "ticket escalation: '#{ ticket.title }'"
  127. event_data[:description] = "T##{ ticket.number }"
  128. events_data.push event_data
  129. end
  130. events_data
  131. end
  132. def events_data_to_ical(events_data)
  133. cal = Icalendar::Calendar.new
  134. events_data.each do |event_data|
  135. cal.event do |e|
  136. e.dtstart = event_data[:dtstart]
  137. e.dtend = event_data[:dtend]
  138. e.summary = event_data[:summary]
  139. e.description = event_data[:description]
  140. e.ip_class = 'PRIVATE'
  141. end
  142. end
  143. send_data(
  144. cal.to_ical,
  145. filename: 'zammad.ical',
  146. type: 'text/plain',
  147. disposition: 'inline'
  148. )
  149. end
  150. end