tickets.rb 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
  2. class CalendarSubscriptions::Tickets
  3. ALLOWED_METHODS = %w[all new_open pending escalation].freeze
  4. def initialize(user, preferences, time_zone)
  5. @user = user
  6. @preferences = preferences
  7. @time_zone = time_zone
  8. end
  9. def all
  10. events_data = []
  11. return events_data if @preferences.blank?
  12. events_data += new_open
  13. events_data += pending
  14. events_data += escalation
  15. events_data
  16. end
  17. def alarm?
  18. alarm = false
  19. return alarm if @preferences.blank?
  20. return alarm if !@preferences[:alarm]
  21. @preferences[:alarm]
  22. end
  23. def owner_ids(method)
  24. owner_ids = []
  25. return owner_ids if @preferences.blank?
  26. return owner_ids if !@preferences[method]
  27. return owner_ids if @preferences[method].blank?
  28. preferences = @preferences[method]
  29. if preferences[:own]
  30. owner_ids = [ @user.id ]
  31. end
  32. if preferences[:not_assigned]
  33. owner_ids.push(1)
  34. end
  35. owner_ids
  36. end
  37. def new_open
  38. events_data = []
  39. owner_ids = owner_ids(:new_open)
  40. return events_data if owner_ids.blank?
  41. condition = {
  42. 'ticket.owner_id' => {
  43. operator: 'is',
  44. value: owner_ids,
  45. },
  46. 'ticket.state_id' => {
  47. operator: 'is',
  48. value: Ticket::State.where(
  49. state_type_id: Ticket::StateType.where(
  50. name: %w[new open],
  51. ),
  52. ).map(&:id),
  53. },
  54. }
  55. tickets = Ticket.search(
  56. current_user: @user,
  57. condition: condition,
  58. )
  59. user_locale = @user.locale
  60. translated_ticket = Translation.translate(user_locale, 'ticket')
  61. events_data = []
  62. tickets.each do |ticket|
  63. event_data = {}
  64. translated_state = Translation.translate(user_locale, ticket.state.name)
  65. event_data[:dtstart] = Icalendar::Values::Date.new(Time.zone.today, 'tzid' => @time_zone)
  66. event_data[:dtend] = Icalendar::Values::Date.new(Time.zone.today, 'tzid' => @time_zone)
  67. event_data[:summary] = "#{translated_state} #{translated_ticket}: '#{ticket.title}'"
  68. event_data[:description] = "T##{ticket.number}"
  69. event_data[:type] = 'new_open'
  70. events_data.push event_data
  71. end
  72. events_data
  73. end
  74. def pending
  75. events_data = []
  76. owner_ids = owner_ids(:pending)
  77. return events_data if owner_ids.blank?
  78. condition = {
  79. 'ticket.owner_id' => {
  80. operator: 'is',
  81. value: owner_ids,
  82. },
  83. 'ticket.state_id' => {
  84. operator: 'is',
  85. value: Ticket::State.where(
  86. state_type_id: Ticket::StateType.where(
  87. name: [
  88. 'pending reminder',
  89. 'pending action',
  90. ],
  91. ),
  92. ).map(&:id),
  93. },
  94. }
  95. tickets = Ticket.search(
  96. current_user: @user,
  97. condition: condition,
  98. )
  99. user_locale = @user.locale
  100. translated_ticket = Translation.translate(user_locale, 'ticket')
  101. customer = Translation.translate(user_locale, 'customer')
  102. events_data = []
  103. tickets.each do |ticket|
  104. next if !ticket.pending_time
  105. event_data = {}
  106. pending_time = ticket.pending_time
  107. if pending_time < Time.zone.today
  108. pending_time = Time.zone.today
  109. end
  110. translated_state = Translation.translate(user_locale, ticket.state.name)
  111. event_data[:dtstart] = Icalendar::Values::DateTime.new(pending_time, 'tzid' => @time_zone)
  112. event_data[:dtend] = Icalendar::Values::DateTime.new(pending_time, 'tzid' => @time_zone)
  113. event_data[:summary] = "#{translated_state} #{translated_ticket}: '#{ticket.title}' #{customer}: #{ticket.customer.longname}"
  114. event_data[:description] = "T##{ticket.number}"
  115. if alarm?
  116. event_data[:alarm] = {
  117. summary: event_data[:summary],
  118. trigger: '-PT1M',
  119. }
  120. end
  121. event_data[:type] = 'pending'
  122. events_data.push event_data
  123. end
  124. events_data
  125. end
  126. def escalation
  127. events_data = []
  128. owner_ids = owner_ids(:escalation)
  129. return events_data if owner_ids.blank?
  130. condition = {
  131. 'ticket.owner_id' => {
  132. operator: 'is',
  133. value: owner_ids,
  134. },
  135. 'ticket.escalation_at' => {
  136. operator: 'is not',
  137. value: nil,
  138. }
  139. }
  140. tickets = Ticket.search(
  141. current_user: @user,
  142. condition: condition,
  143. )
  144. user_locale = @user.locale
  145. translated_ticket_escalation = Translation.translate(user_locale, 'ticket escalation')
  146. customer = Translation.translate(user_locale, 'customer')
  147. tickets.each do |ticket|
  148. next if !ticket.escalation_at
  149. event_data = {}
  150. escalation_at = ticket.escalation_at
  151. if escalation_at < Time.zone.today
  152. escalation_at = Time.zone.today
  153. end
  154. event_data[:dtstart] = Icalendar::Values::DateTime.new(escalation_at, 'tzid' => @time_zone)
  155. event_data[:dtend] = Icalendar::Values::DateTime.new(escalation_at, 'tzid' => @time_zone)
  156. event_data[:summary] = "#{translated_ticket_escalation}: '#{ticket.title}' #{customer}: #{ticket.customer.longname}"
  157. event_data[:description] = "T##{ticket.number}"
  158. if alarm?
  159. event_data[:alarm] = {
  160. summary: event_data[:summary],
  161. trigger: '-PT1M',
  162. }
  163. end
  164. event_data[:type] = 'escalated'
  165. events_data.push event_data
  166. end
  167. events_data
  168. end
  169. end