tickets.rb 4.5 KB

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