ticket_sla_test.rb 80 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217
  1. require 'test_helper'
  2. class TicketSlaTest < ActiveSupport::TestCase
  3. test 'ticket sla' do
  4. ticket = Ticket.create!(
  5. title: 'some title äöüß',
  6. group: Group.lookup(name: 'Users'),
  7. customer_id: 2,
  8. state: Ticket::State.lookup(name: 'new'),
  9. priority: Ticket::Priority.lookup(name: '2 normal'),
  10. created_at: '2013-03-21 09:30:00 UTC',
  11. updated_at: '2013-03-21 09:30:00 UTC',
  12. updated_by_id: 1,
  13. created_by_id: 1,
  14. )
  15. assert(ticket, 'ticket created')
  16. assert_nil(ticket.escalation_at, 'ticket.escalation_at verify')
  17. calendar1 = Calendar.create_or_update(
  18. name: 'EU 1',
  19. timezone: 'Europe/Berlin',
  20. business_hours: {
  21. mon: {
  22. active: true,
  23. timeframes: [ ['09:00', '17:00'] ]
  24. },
  25. tue: {
  26. active: true,
  27. timeframes: [ ['09:00', '17:00'] ]
  28. },
  29. wed: {
  30. active: true,
  31. timeframes: [ ['09:00', '17:00'] ]
  32. },
  33. thu: {
  34. active: true,
  35. timeframes: [ ['09:00', '17:00'] ]
  36. },
  37. fri: {
  38. active: true,
  39. timeframes: [ ['09:00', '17:00'] ]
  40. },
  41. sat: {
  42. active: false,
  43. timeframes: [ ['08:00', '17:00'] ]
  44. },
  45. sun: {
  46. active: false,
  47. timeframes: [ ['08:00', '17:00'] ]
  48. },
  49. },
  50. default: true,
  51. ical_url: nil,
  52. updated_by_id: 1,
  53. created_by_id: 1,
  54. )
  55. sla = Sla.create_or_update(
  56. name: 'test sla 1',
  57. condition: {},
  58. first_response_time: 60,
  59. update_time: 180,
  60. solution_time: 240,
  61. calendar_id: calendar1.id,
  62. updated_by_id: 1,
  63. created_by_id: 1,
  64. )
  65. Scheduler.worker(true)
  66. ticket = Ticket.find(ticket.id)
  67. assert_equal(ticket.escalation_at.gmtime.to_s, '2013-03-21 10:30:00 UTC', 'ticket.escalation_at verify 1')
  68. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-03-21 10:30:00 UTC', 'ticket.first_response_escalation_at verify 1')
  69. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.update_escalation_at verify 1')
  70. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-03-21 13:30:00 UTC', 'ticket.close_escalation_at verify 1')
  71. sla = Sla.create_or_update(
  72. name: 'test sla 1',
  73. condition: {},
  74. first_response_time: 120,
  75. update_time: 180,
  76. solution_time: 240,
  77. calendar_id: calendar1.id,
  78. updated_by_id: 1,
  79. created_by_id: 1,
  80. )
  81. Scheduler.worker(true)
  82. ticket = Ticket.find(ticket.id)
  83. assert_equal(ticket.escalation_at.gmtime.to_s, '2013-03-21 11:30:00 UTC', 'ticket.escalation_at verify 1')
  84. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-03-21 11:30:00 UTC', 'ticket.first_response_escalation_at verify 1')
  85. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.update_escalation_at verify 1')
  86. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-03-21 13:30:00 UTC', 'ticket.close_escalation_at verify 1')
  87. delete = sla.destroy
  88. assert(delete, 'sla destroy 1')
  89. calendar2 = Calendar.create_or_update(
  90. name: 'EU 2',
  91. timezone: 'Europe/Berlin',
  92. business_hours: {
  93. mon: {
  94. active: true,
  95. timeframes: [ ['08:00', '18:00'] ]
  96. },
  97. tue: {
  98. active: true,
  99. timeframes: [ ['08:00', '18:00'] ]
  100. },
  101. wed: {
  102. active: true,
  103. timeframes: [ ['08:00', '18:00'] ]
  104. },
  105. thu: {
  106. active: true,
  107. timeframes: [ ['08:00', '18:00'] ]
  108. },
  109. fri: {
  110. active: true,
  111. timeframes: [ ['08:00', '18:00'] ]
  112. },
  113. sat: {
  114. active: false,
  115. timeframes: [ ['08:00', '17:00'] ]
  116. },
  117. sun: {
  118. active: false,
  119. timeframes: [ ['08:00', '17:00'] ]
  120. },
  121. },
  122. default: true,
  123. ical_url: nil,
  124. updated_by_id: 1,
  125. created_by_id: 1,
  126. )
  127. sla = Sla.create_or_update(
  128. name: 'test sla 2',
  129. condition: {
  130. 'ticket.priority_id' => {
  131. operator: 'is',
  132. value: %w[1 2 3],
  133. },
  134. },
  135. calendar_id: calendar2.id,
  136. first_response_time: 60,
  137. update_time: 120,
  138. solution_time: 180,
  139. updated_by_id: 1,
  140. created_by_id: 1,
  141. )
  142. Scheduler.worker(true)
  143. ticket = Ticket.find(ticket.id)
  144. assert_equal(ticket.escalation_at.gmtime.to_s, '2013-03-21 10:30:00 UTC', 'ticket.escalation_at verify 2')
  145. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-03-21 10:30:00 UTC', 'ticket.first_response_escalation_at verify 2')
  146. assert_nil(ticket.first_response_at, 'ticket.first_response_at verify 2')
  147. assert_nil(ticket.first_response_in_min, 'ticket.first_response_in_min verify 2')
  148. assert_nil(ticket.first_response_diff_in_min, 'ticket.first_response_diff_in_min verify 2')
  149. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-03-21 11:30:00 UTC', 'ticket.update_escalation_at verify 2')
  150. assert_nil(ticket.update_in_min, 'ticket.update_in_min verify 2')
  151. assert_nil(ticket.update_diff_in_min, 'ticket.update_diff_in_min verify 2')
  152. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.close_escalation_at verify 2')
  153. assert_nil(ticket.close_in_min, 'ticket.close_in_min verify 2')
  154. assert_nil(ticket.close_diff_in_min, 'ticket.close_diff_in_min verify 2')
  155. # set first response in time
  156. ticket.update!(
  157. first_response_at: '2013-03-21 10:00:00 UTC',
  158. )
  159. assert_equal(ticket.escalation_at.gmtime.to_s, '2013-03-21 11:30:00 UTC', 'ticket.escalation_at verify 3')
  160. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-03-21 10:30:00 UTC', 'ticket.first_response_escalation_at verify 3')
  161. assert_equal(ticket.first_response_at.gmtime.to_s, '2013-03-21 10:00:00 UTC', 'ticket.first_response_at verify 3')
  162. assert_equal(ticket.first_response_in_min, 30, 'ticket.first_response_in_min verify 3')
  163. assert_equal(ticket.first_response_diff_in_min, 30, 'ticket.first_response_diff_in_min verify 3')
  164. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-03-21 11:30:00 UTC', 'ticket.update_escalation_at verify 3')
  165. assert_nil(ticket.update_in_min, 'ticket.update_in_min verify 3')
  166. assert_nil(ticket.update_diff_in_min, 'ticket.update_diff_in_min verify 3')
  167. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.close_escalation_at verify 3')
  168. assert_nil(ticket.close_in_min, 'ticket.close_in_min verify 3')
  169. assert_nil(ticket.close_diff_in_min, 'ticket.close_diff_in_min verify 3')
  170. # set first reponse over time
  171. ticket.update!(
  172. first_response_at: '2013-03-21 14:00:00 UTC',
  173. )
  174. assert_equal(ticket.escalation_at.gmtime.to_s, '2013-03-21 11:30:00 UTC', 'ticket.escalation_at verify 4')
  175. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-03-21 10:30:00 UTC', 'ticket.first_response_escalation_at verify 4')
  176. assert_equal(ticket.first_response_at.gmtime.to_s, '2013-03-21 14:00:00 UTC', 'ticket.first_response_at verify 4')
  177. assert_equal(ticket.first_response_in_min, 270, 'ticket.first_response_in_min verify 4')
  178. assert_equal(ticket.first_response_diff_in_min, -210, 'ticket.first_response_diff_in_min verify 4')
  179. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-03-21 11:30:00 UTC', 'ticket.update_escalation_at verify 4')
  180. assert_nil(ticket.update_in_min, 'ticket.update_in_min verify 4')
  181. assert_nil(ticket.update_diff_in_min, 'ticket.update_diff_in_min verify 4')
  182. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.close_escalation_at verify 4')
  183. assert_nil(ticket.close_in_min, 'ticket.close_in_min verify 4')
  184. assert_nil(ticket.close_diff_in_min, 'ticket.close_diff_in_min verify 4')
  185. # set update time in time
  186. ticket.update!(
  187. last_contact_agent_at: '2013-03-21 11:00:00 UTC',
  188. )
  189. assert_equal(ticket.escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.escalation_at verify 5')
  190. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-03-21 10:30:00 UTC', 'ticket.first_response_escalation_at verify 5')
  191. assert_equal(ticket.first_response_at.gmtime.to_s, '2013-03-21 14:00:00 UTC', 'ticket.first_response_at verify 5')
  192. assert_equal(ticket.first_response_in_min, 270, 'ticket.first_response_in_min verify 5')
  193. assert_equal(ticket.first_response_diff_in_min, -210, 'ticket.first_response_diff_in_min verify 5')
  194. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-03-21 13:00:00 UTC', 'ticket.update_escalation_at verify 5')
  195. assert_equal(ticket.update_in_min, 90, 'ticket.update_in_min verify 5')
  196. assert_equal(ticket.update_diff_in_min, 30, 'ticket.update_diff_in_min verify 5')
  197. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.close_escalation_at verify 5')
  198. assert_nil(ticket.close_in_min, 'ticket.close_in_min verify 5')
  199. assert_nil(ticket.close_diff_in_min, 'ticket.close_diff_in_min verify 5')
  200. # set update time over time
  201. ticket.update!(
  202. last_contact_agent_at: '2013-03-21 12:00:00 UTC',
  203. )
  204. assert_equal(ticket.escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.escalation_at verify 6')
  205. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-03-21 10:30:00 UTC', 'ticket.first_response_escalation_at verify 6')
  206. assert_equal(ticket.first_response_at.gmtime.to_s, '2013-03-21 14:00:00 UTC', 'ticket.first_response_at verify 6')
  207. assert_equal(ticket.first_response_in_min, 270, 'ticket.first_response_in_min verify 6')
  208. assert_equal(ticket.first_response_diff_in_min, -210, 'ticket.first_response_diff_in_min verify 6')
  209. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-03-21 14:00:00 UTC', 'ticket.update_escalation_at verify 6')
  210. assert_equal(ticket.update_in_min, 150, 'ticket.update_in_min verify 6')
  211. assert_equal(ticket.update_diff_in_min, -30, 'ticket.update_diff_in_min verify 6')
  212. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.close_escalation_at verify 6')
  213. assert_nil(ticket.close_in_min, 'ticket.close_in_min verify 6')
  214. assert_nil(ticket.close_diff_in_min, 'ticket.close_diff_in_min verify 6')
  215. # set update time over time
  216. ticket.update!(
  217. last_contact_customer_at: '2013-03-21 12:05:00 UTC',
  218. )
  219. assert_equal(ticket.escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.escalation_at verify 6')
  220. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-03-21 10:30:00 UTC', 'ticket.first_response_escalation_at verify 6')
  221. assert_equal(ticket.first_response_at.gmtime.to_s, '2013-03-21 14:00:00 UTC', 'ticket.first_response_at verify 6')
  222. assert_equal(ticket.first_response_in_min, 270, 'ticket.first_response_in_min verify 6')
  223. assert_equal(ticket.first_response_diff_in_min, -210, 'ticket.first_response_diff_in_min verify 6')
  224. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-03-21 14:05:00 UTC', 'ticket.update_escalation_at verify 6')
  225. assert_equal(ticket.update_in_min, 155, 'ticket.update_in_min verify 6')
  226. assert_equal(ticket.update_diff_in_min, -35, 'ticket.update_diff_in_min verify 6')
  227. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.close_escalation_at verify 6')
  228. assert_nil(ticket.close_in_min, 'ticket.close_in_min verify 6')
  229. assert_nil(ticket.close_diff_in_min, 'ticket.close_diff_in_min verify 6')
  230. # set update time over time
  231. ticket.update!(
  232. last_contact_agent_at: '2013-03-21 12:10:00 UTC',
  233. )
  234. assert_equal(ticket.escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.escalation_at verify 6')
  235. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-03-21 10:30:00 UTC', 'ticket.first_response_escalation_at verify 6')
  236. assert_equal(ticket.first_response_at.gmtime.to_s, '2013-03-21 14:00:00 UTC', 'ticket.first_response_at verify 6')
  237. assert_equal(ticket.first_response_in_min, 270, 'ticket.first_response_in_min verify 6')
  238. assert_equal(ticket.first_response_diff_in_min, -210, 'ticket.first_response_diff_in_min verify 6')
  239. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-03-21 14:10:00 UTC', 'ticket.update_escalation_at verify 6')
  240. assert_equal(ticket.update_in_min, 160, 'ticket.update_in_min verify 6')
  241. assert_equal(ticket.update_diff_in_min, -40, 'ticket.update_diff_in_min verify 6')
  242. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.close_escalation_at verify 6')
  243. assert_nil(ticket.close_in_min, 'ticket.close_in_min verify 6')
  244. assert_nil(ticket.close_diff_in_min, 'ticket.close_diff_in_min verify 6')
  245. # set close time in time
  246. ticket.update!(
  247. close_at: '2013-03-21 11:30:00 UTC',
  248. )
  249. assert_equal(ticket.escalation_at.gmtime.to_s, '2013-03-21 14:10:00 UTC', 'ticket.escalation_at verify 7')
  250. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-03-21 10:30:00 UTC', 'ticket.first_response_escalation_at verify 7')
  251. assert_equal(ticket.first_response_at.gmtime.to_s, '2013-03-21 14:00:00 UTC', 'ticket.first_response_at verify 7')
  252. assert_equal(ticket.first_response_in_min, 270, 'ticket.first_response_in_min verify 7')
  253. assert_equal(ticket.first_response_diff_in_min, -210, 'ticket.first_response_diff_in_min verify 7')
  254. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-03-21 14:10:00 UTC', 'ticket.update_escalation_at verify 7')
  255. assert_equal(ticket.update_in_min, 160, 'ticket.update_in_min verify 7')
  256. assert_equal(ticket.update_diff_in_min, -40, 'ticket.update_diff_in_min verify 7')
  257. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.close_escalation_at verify 7')
  258. assert_equal(ticket.close_in_min, 120, 'ticket.close_in_min verify 7')
  259. assert_equal(ticket.close_diff_in_min, 60, 'ticket.close_diff_in_min verify 7')
  260. # set close time over time
  261. ticket.update!(
  262. close_at: '2013-03-21 13:00:00 UTC',
  263. )
  264. assert_equal(ticket.escalation_at.gmtime.to_s, '2013-03-21 14:10:00 UTC', 'ticket.escalation_at verify 8')
  265. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-03-21 10:30:00 UTC', 'ticket.first_response_escalation_at verify 8')
  266. assert_equal(ticket.first_response_at.gmtime.to_s, '2013-03-21 14:00:00 UTC', 'ticket.first_response_at verify 8')
  267. assert_equal(ticket.first_response_in_min, 270, 'ticket.first_response_in_min verify 8')
  268. assert_equal(ticket.first_response_diff_in_min, -210, 'ticket.first_response_diff_in_min verify 8')
  269. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-03-21 14:10:00 UTC', 'ticket.update_escalation_at verify 8')
  270. assert_equal(ticket.update_in_min, 160, 'ticket.update_in_min verify 8')
  271. assert_equal(ticket.update_diff_in_min, -40, 'ticket.update_diff_in_min verify 8')
  272. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.close_escalation_at verify 8')
  273. assert_equal(ticket.close_in_min, 210, 'ticket.close_in_min verify 8')
  274. assert_equal(ticket.close_diff_in_min, -30, 'ticket.close_diff_in_min verify 8')
  275. # set close time over time
  276. ticket.update!(
  277. state: Ticket::State.lookup(name: 'closed')
  278. )
  279. assert_nil(ticket.escalation_at, 'ticket.escalation_at verify 9')
  280. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-03-21 10:30:00 UTC', 'ticket.first_response_escalation_at verify 9')
  281. assert_equal(ticket.first_response_at.gmtime.to_s, '2013-03-21 14:00:00 UTC', 'ticket.first_response_at verify 9')
  282. assert_equal(ticket.first_response_in_min, 270, 'ticket.first_response_in_min verify 9')
  283. assert_equal(ticket.first_response_diff_in_min, -210, 'ticket.first_response_diff_in_min verify 9')
  284. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-03-21 14:10:00 UTC', 'ticket.update_escalation_at verify 9')
  285. assert_equal(ticket.update_in_min, 160, 'ticket.update_in_min verify 9')
  286. assert_equal(ticket.update_diff_in_min, -40, 'ticket.update_diff_in_min verify 9')
  287. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.close_escalation_at verify 9')
  288. assert_equal(ticket.close_in_min, 210, 'ticket.close_in_min verify 9')
  289. assert_equal(ticket.close_diff_in_min, -30, 'ticket.close_diff_in_min verify 9')
  290. delete = ticket.destroy
  291. assert(delete, 'ticket destroy')
  292. ticket = Ticket.create!(
  293. title: 'some title äöüß',
  294. group: Group.lookup(name: 'Users'),
  295. customer_id: 2,
  296. state: Ticket::State.lookup(name: 'new'),
  297. priority: Ticket::Priority.lookup(name: '2 normal'),
  298. updated_by_id: 1,
  299. created_by_id: 1,
  300. created_at: '2013-03-28 23:49:00 UTC',
  301. updated_at: '2013-03-28 23:49:00 UTC',
  302. )
  303. assert(ticket, 'ticket created')
  304. assert_equal(ticket.title, 'some title äöüß', 'ticket.title verify')
  305. assert_equal(ticket.group.name, 'Users', 'ticket.group verify')
  306. assert_equal(ticket.state.name, 'new', 'ticket.state verify')
  307. # create inbound article
  308. article_inbound = Ticket::Article.create!(
  309. ticket_id: ticket.id,
  310. from: 'some_sender@example.com',
  311. to: 'some_recipient@example.com',
  312. subject: 'some subject',
  313. message_id: 'some@id',
  314. body: 'some message',
  315. internal: false,
  316. sender: Ticket::Article::Sender.where(name: 'Customer').first,
  317. type: Ticket::Article::Type.where(name: 'email').first,
  318. updated_by_id: 1,
  319. created_by_id: 1,
  320. created_at: '2013-03-28 23:49:00 UTC',
  321. updated_at: '2013-03-28 23:49:00 UTC',
  322. )
  323. ticket = Ticket.find(ticket.id)
  324. assert_equal(ticket.article_count, 1, 'ticket.article_count verify - inbound')
  325. assert_equal(ticket.last_contact_at.to_s, article_inbound.created_at.to_s, 'ticket.last_contact_at verify - inbound')
  326. assert_equal(ticket.last_contact_customer_at.to_s, article_inbound.created_at.to_s, 'ticket.last_contact_customer_at verify - inbound')
  327. assert_nil(ticket.last_contact_agent_at, 'ticket.last_contact_agent_at verify - inbound')
  328. assert_nil(ticket.first_response_at, 'ticket.first_response_at verify - inbound')
  329. assert_nil(ticket.close_at, 'ticket.close_at verify - inbound')
  330. # create outbound article
  331. article_outbound = Ticket::Article.create!(
  332. ticket_id: ticket.id,
  333. from: 'some_recipient@example.com',
  334. to: 'some_sender@example.com',
  335. subject: 'some subject',
  336. message_id: 'some@id2',
  337. body: 'some message 2',
  338. internal: false,
  339. sender: Ticket::Article::Sender.where(name: 'Agent').first,
  340. type: Ticket::Article::Type.where(name: 'email').first,
  341. updated_by_id: 1,
  342. created_by_id: 1,
  343. created_at: '2013-03-29 07:00:03 UTC',
  344. updated_at: '2013-03-29 07:00:03 UTC',
  345. )
  346. ticket = Ticket.find(ticket.id)
  347. assert_equal(ticket.article_count, 2, 'ticket.article_count verify - outbound')
  348. assert_equal(ticket.last_contact_at.to_s, article_outbound.created_at.to_s, 'ticket.last_contact_at verify - outbound')
  349. assert_equal(ticket.last_contact_customer_at.to_s, article_inbound.created_at.to_s, 'ticket.last_contact_customer_at verify - outbound')
  350. assert_equal(ticket.last_contact_agent_at.to_s, article_outbound.created_at.to_s, 'ticket.last_contact_agent_at verify - outbound')
  351. assert_equal(ticket.first_response_at.to_s, article_outbound.created_at.to_s, 'ticket.first_response_at verify - outbound')
  352. assert_equal(ticket.first_response_in_min, 0, 'ticket.first_response_in_min verify - outbound')
  353. assert_equal(ticket.first_response_diff_in_min, 60, 'ticket.first_response_diff_in_min verify - outbound')
  354. assert_nil(ticket.close_at, 'ticket.close_at verify - outbound')
  355. delete = ticket.destroy
  356. assert(delete, 'ticket destroy')
  357. ticket = Ticket.create!(
  358. title: 'some title äöüß',
  359. group: Group.lookup(name: 'Users'),
  360. customer_id: 2,
  361. state: Ticket::State.lookup(name: 'new'),
  362. priority: Ticket::Priority.lookup(name: '2 normal'),
  363. updated_by_id: 1,
  364. created_by_id: 1,
  365. created_at: '2013-03-28 23:49:00 UTC',
  366. updated_at: '2013-03-28 23:49:00 UTC',
  367. )
  368. assert(ticket, 'ticket created')
  369. assert_equal(ticket.title, 'some title äöüß', 'ticket.title verify')
  370. assert_equal(ticket.group.name, 'Users', 'ticket.group verify')
  371. assert_equal(ticket.state.name, 'new', 'ticket.state verify')
  372. # create inbound article
  373. article_inbound = Ticket::Article.create!(
  374. ticket_id: ticket.id,
  375. from: 'some_sender@example.com',
  376. subject: 'some subject',
  377. message_id: 'some@id',
  378. body: 'some message',
  379. internal: false,
  380. sender: Ticket::Article::Sender.where(name: 'Customer').first,
  381. type: Ticket::Article::Type.where(name: 'phone').first,
  382. updated_by_id: 1,
  383. created_by_id: 1,
  384. created_at: '2013-03-28 23:49:00 UTC',
  385. updated_at: '2013-03-28 23:49:00 UTC',
  386. )
  387. ticket = Ticket.find(ticket.id)
  388. assert_equal(ticket.article_count, 1, 'ticket.article_count verify - inbound')
  389. assert_equal(ticket.last_contact_at.to_s, article_inbound.created_at.to_s, 'ticket.last_contact_at verify - inbound')
  390. assert_equal(ticket.last_contact_customer_at.to_s, article_inbound.created_at.to_s, 'ticket.last_contact_customer_at verify - inbound')
  391. assert_nil(ticket.last_contact_agent_at, 'ticket.last_contact_agent_at verify - inbound')
  392. assert_nil(ticket.first_response_at, 'ticket.first_response_at verify - inbound')
  393. assert_nil(ticket.close_at, 'ticket.close_at verify - inbound')
  394. # create note article
  395. article_note = Ticket::Article.create!(
  396. ticket_id: ticket.id,
  397. from: 'some_sender@example.com',
  398. subject: 'some subject',
  399. message_id: 'some@id',
  400. body: 'some message',
  401. internal: false,
  402. sender: Ticket::Article::Sender.where(name: 'Agent').first,
  403. type: Ticket::Article::Type.where(name: 'note').first,
  404. updated_by_id: 1,
  405. created_by_id: 1,
  406. created_at: '2013-03-28 23:52:00 UTC',
  407. updated_at: '2013-03-28 23:52:00 UTC',
  408. )
  409. ticket = Ticket.find(ticket.id)
  410. assert_equal(ticket.article_count, 2, 'ticket.article_count verify - inbound')
  411. assert_equal(ticket.last_contact_at.to_s, article_inbound.created_at.to_s, 'ticket.last_contact_at verify - inbound')
  412. assert_equal(ticket.last_contact_customer_at.to_s, article_inbound.created_at.to_s, 'ticket.last_contact_customer_at verify - inbound')
  413. assert_nil(ticket.last_contact_agent_at, 'ticket.last_contact_agent_at verify - inbound')
  414. assert_nil(ticket.first_response_at, 'ticket.first_response_at verify - inbound')
  415. assert_nil(ticket.close_at, 'ticket.close_at verify - inbound')
  416. # create outbound article
  417. article_outbound = Ticket::Article.create!(
  418. ticket_id: ticket.id,
  419. from: 'some_sender@example.com',
  420. subject: 'some subject',
  421. message_id: 'some@id',
  422. body: 'some message',
  423. internal: false,
  424. sender: Ticket::Article::Sender.where(name: 'Agent').first,
  425. type: Ticket::Article::Type.where(name: 'phone').first,
  426. updated_by_id: 1,
  427. created_by_id: 1,
  428. created_at: '2013-03-28 23:55:00 UTC',
  429. updated_at: '2013-03-28 23:55:00 UTC',
  430. )
  431. ticket = Ticket.find(ticket.id)
  432. assert_equal(ticket.article_count, 3, 'ticket.article_count verify - inbound')
  433. assert_equal(ticket.last_contact_at.to_s, article_outbound.created_at.to_s, 'ticket.last_contact_at verify - inbound')
  434. assert_equal(ticket.last_contact_customer_at.to_s, article_inbound.created_at.to_s, 'ticket.last_contact_customer_at verify - inbound')
  435. assert_equal(ticket.last_contact_agent_at.to_s, article_outbound.created_at.to_s, 'ticket.last_contact_agent_at verify - inbound')
  436. assert_equal(ticket.first_response_at.to_s, article_outbound.created_at.to_s, 'ticket.first_response_at verify - inbound')
  437. assert_nil(ticket.close_at, 'ticket.close_at verify - inbound')
  438. calendar1.destroy!
  439. calendar2.destroy!
  440. end
  441. test 'ticket sla + selector' do
  442. calendar1 = Calendar.create_or_update(
  443. name: 'EU 1',
  444. timezone: 'Europe/Berlin',
  445. business_hours: {
  446. mon: {
  447. active: true,
  448. timeframes: [ ['09:00', '17:00'] ]
  449. },
  450. tue: {
  451. active: true,
  452. timeframes: [ ['09:00', '17:00'] ]
  453. },
  454. wed: {
  455. active: true,
  456. timeframes: [ ['09:00', '17:00'] ]
  457. },
  458. thu: {
  459. active: true,
  460. timeframes: [ ['09:00', '17:00'] ]
  461. },
  462. fri: {
  463. active: true,
  464. timeframes: [ ['09:00', '17:00'] ]
  465. },
  466. sat: {
  467. active: false,
  468. timeframes: [ ['08:00', '17:00'] ]
  469. },
  470. sun: {
  471. active: false,
  472. timeframes: [ ['08:00', '17:00'] ]
  473. },
  474. },
  475. default: true,
  476. ical_url: nil,
  477. updated_by_id: 1,
  478. created_by_id: 1,
  479. )
  480. sla = Sla.create_or_update(
  481. name: 'test sla 1',
  482. condition: {
  483. 'ticket.priority_id' => {
  484. operator: 'is',
  485. value: %w[2],
  486. },
  487. },
  488. first_response_time: 60,
  489. update_time: 180,
  490. solution_time: 240,
  491. calendar_id: calendar1.id,
  492. updated_by_id: 1,
  493. created_by_id: 1,
  494. )
  495. ticket = Ticket.create!(
  496. title: 'some title äöüß',
  497. group: Group.lookup(name: 'Users'),
  498. customer_id: 2,
  499. state: Ticket::State.lookup(name: 'new'),
  500. priority: Ticket::Priority.lookup(name: '2 normal'),
  501. created_at: '2013-03-21 09:30:00 UTC',
  502. updated_at: '2013-03-21 09:30:00 UTC',
  503. updated_by_id: 1,
  504. created_by_id: 1,
  505. )
  506. ticket.reload
  507. assert_equal(ticket.escalation_at.gmtime.to_s, '2013-03-21 10:30:00 UTC', 'ticket.escalation_at')
  508. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-03-21 10:30:00 UTC', 'ticket.first_response_escalation_at')
  509. assert_nil(ticket.first_response_at, 'ticket.first_response_at')
  510. assert_nil(ticket.first_response_in_min, 'ticket.first_response_in_min')
  511. assert_nil(ticket.first_response_diff_in_min, 'ticket.first_response_diff_in_min')
  512. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.update_escalation_at')
  513. assert_nil(ticket.update_in_min, 'ticket.update_in_min')
  514. assert_nil(ticket.update_diff_in_min, 'ticket.update_diff_in_min')
  515. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-03-21 13:30:00 UTC', 'ticket.close_escalation_at')
  516. assert_nil(ticket.close_in_min, 'ticket.close_in_min')
  517. assert_nil(ticket.close_diff_in_min, 'ticket.close_diff_in_min')
  518. ticket.priority = Ticket::Priority.lookup(name: '1 low')
  519. ticket.save!
  520. ticket.reload
  521. assert_nil(ticket.escalation_at, 'ticket.escalation_at')
  522. assert_nil(ticket.first_response_escalation_at, 'ticket.first_response_escalation_at')
  523. assert_nil(ticket.first_response_at, 'ticket.first_response_at')
  524. assert_nil(ticket.first_response_in_min, 'ticket.first_response_in_min')
  525. assert_nil(ticket.first_response_diff_in_min, 'ticket.first_response_diff_in_min')
  526. assert_nil(ticket.update_escalation_at, 'ticket.update_escalation_at')
  527. assert_nil(ticket.update_in_min, 'ticket.update_in_min')
  528. assert_nil(ticket.update_diff_in_min, 'ticket.update_diff_in_min')
  529. assert_nil(ticket.close_escalation_at, 'ticket.close_escalation_at')
  530. assert_nil(ticket.close_in_min, 'ticket.close_in_min')
  531. assert_nil(ticket.close_diff_in_min, 'ticket.close_diff_in_min')
  532. calendar1.destroy!
  533. end
  534. test 'ticket sla + timezone + holiday' do
  535. ticket = Ticket.create!(
  536. title: 'some title äöüß',
  537. group: Group.lookup(name: 'Users'),
  538. customer_id: 2,
  539. state: Ticket::State.lookup(name: 'new'),
  540. priority: Ticket::Priority.lookup(name: '2 normal'),
  541. created_at: '2013-03-21 09:30:00 UTC',
  542. updated_at: '2013-03-21 09:30:00 UTC',
  543. updated_by_id: 1,
  544. created_by_id: 1,
  545. )
  546. assert(ticket, 'ticket created')
  547. assert_nil(ticket.escalation_at, 'ticket.escalation_at verify')
  548. # set sla's for timezone "Europe/Berlin" wintertime (+1), so UTC times are 7:00-16:00
  549. calendar = Calendar.create_or_update(
  550. name: 'EU 3',
  551. timezone: 'Europe/Berlin',
  552. business_hours: {
  553. mon: {
  554. active: true,
  555. timeframes: [ ['08:00', '17:00'] ]
  556. },
  557. tue: {
  558. active: true,
  559. timeframes: [ ['08:00', '17:00'] ]
  560. },
  561. wed: {
  562. active: true,
  563. timeframes: [ ['08:00', '17:00'] ]
  564. },
  565. thu: {
  566. active: true,
  567. timeframes: [ ['08:00', '17:00'] ]
  568. },
  569. fri: {
  570. active: true,
  571. timeframes: [ ['08:00', '17:00'] ]
  572. },
  573. sat: {
  574. active: true,
  575. timeframes: [ ['08:00', '17:00'] ]
  576. },
  577. sun: {
  578. active: true,
  579. timeframes: [ ['08:00', '17:00'] ]
  580. },
  581. },
  582. default: true,
  583. ical_url: nil,
  584. updated_by_id: 1,
  585. created_by_id: 1,
  586. )
  587. sla = Sla.create_or_update(
  588. name: 'aaa should not match',
  589. condition: {
  590. 'ticket.priority_id' => {
  591. operator: 'is not',
  592. value: %w[1 2 3],
  593. },
  594. },
  595. calendar_id: calendar.id,
  596. first_response_time: 10,
  597. update_time: 20,
  598. solution_time: 300,
  599. updated_by_id: 1,
  600. created_by_id: 1,
  601. )
  602. sla = Sla.create_or_update(
  603. name: 'test sla 3',
  604. condition: {
  605. 'ticket.priority_id' => {
  606. operator: 'is not',
  607. value: '1',
  608. },
  609. },
  610. calendar_id: calendar.id,
  611. first_response_time: 120,
  612. update_time: 180,
  613. solution_time: 240,
  614. updated_by_id: 1,
  615. created_by_id: 1,
  616. )
  617. Scheduler.worker(true)
  618. ticket = Ticket.find(ticket.id)
  619. assert_equal(ticket.escalation_at.gmtime.to_s, '2013-03-21 11:30:00 UTC', 'ticket.escalation_at verify 1')
  620. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-03-21 11:30:00 UTC', 'ticket.first_response_escalation_at verify 1')
  621. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-03-21 12:30:00 UTC', 'ticket.update_escalation_at verify 1')
  622. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-03-21 13:30:00 UTC', 'ticket.close_escalation_at verify 1')
  623. delete = sla.destroy
  624. assert(delete, 'sla destroy')
  625. delete = ticket.destroy
  626. assert(delete, 'ticket destroy')
  627. ticket = Ticket.create!(
  628. title: 'some title äöüß',
  629. group: Group.lookup(name: 'Users'),
  630. customer_id: 2,
  631. state: Ticket::State.lookup(name: 'new'),
  632. priority: Ticket::Priority.lookup(name: '2 normal'),
  633. created_at: '2013-10-21 09:30:00 UTC',
  634. updated_at: '2013-10-21 09:30:00 UTC',
  635. updated_by_id: 1,
  636. created_by_id: 1,
  637. )
  638. assert(ticket, 'ticket created')
  639. assert_nil(ticket.escalation_at, 'ticket.escalation_at verify')
  640. # set sla's for timezone "Europe/Berlin" summertime (+2), so UTC times are 6:00-15:00
  641. calendar = Calendar.create_or_update(
  642. name: 'EU 4',
  643. timezone: 'Europe/Berlin',
  644. business_hours: {
  645. mon: {
  646. active: true,
  647. timeframes: [ ['08:00', '17:00'] ]
  648. },
  649. tue: {
  650. active: true,
  651. timeframes: [ ['08:00', '17:00'] ]
  652. },
  653. wed: {
  654. active: true,
  655. timeframes: [ ['08:00', '17:00'] ]
  656. },
  657. thu: {
  658. active: true,
  659. timeframes: [ ['08:00', '17:00'] ]
  660. },
  661. fri: {
  662. active: true,
  663. timeframes: [ ['08:00', '17:00'] ]
  664. },
  665. sat: {
  666. active: true,
  667. timeframes: [ ['08:00', '17:00'] ]
  668. },
  669. sun: {
  670. active: true,
  671. timeframes: [ ['08:00', '17:00'] ]
  672. },
  673. },
  674. public_holidays: {
  675. '2015-09-22' => {
  676. 'active' => true,
  677. 'summary' => 'test 1',
  678. },
  679. '2015-09-23' => {
  680. 'active' => false,
  681. 'summary' => 'test 2',
  682. },
  683. '2015-09-24' => {
  684. 'removed' => false,
  685. 'summary' => 'test 3',
  686. },
  687. },
  688. default: true,
  689. ical_url: nil,
  690. updated_by_id: 1,
  691. created_by_id: 1,
  692. )
  693. sla = Sla.create_or_update(
  694. name: 'test sla 4',
  695. condition: {},
  696. calendar_id: calendar.id,
  697. first_response_time: 120,
  698. update_time: 180,
  699. solution_time: 240,
  700. updated_by_id: 1,
  701. created_by_id: 1,
  702. )
  703. Scheduler.worker(true)
  704. ticket = Ticket.find(ticket.id)
  705. assert_equal(ticket.escalation_at.gmtime.to_s, '2013-10-21 11:30:00 UTC', 'ticket.escalation_at verify 1')
  706. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-10-21 11:30:00 UTC', 'ticket.first_response_escalation_at verify 1')
  707. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-10-21 12:30:00 UTC', 'ticket.update_escalation_at verify 1')
  708. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-10-21 13:30:00 UTC', 'ticket.close_escalation_at verify 1')
  709. delete = ticket.destroy
  710. assert(delete, 'ticket destroy')
  711. delete = sla.destroy
  712. assert(delete, 'sla destroy')
  713. ticket = Ticket.create!(
  714. title: 'some title äöüß',
  715. group: Group.lookup(name: 'Users'),
  716. customer_id: 2,
  717. state: Ticket::State.lookup(name: 'new'),
  718. priority: Ticket::Priority.lookup(name: '2 normal'),
  719. created_at: '2013-10-21 05:30:00 UTC',
  720. updated_at: '2013-10-21 05:30:00 UTC',
  721. updated_by_id: 1,
  722. created_by_id: 1,
  723. )
  724. assert(ticket, 'ticket created')
  725. assert_nil(ticket.escalation_at, 'ticket.escalation_at verify')
  726. # set sla's for timezone "Europe/Berlin" summertime (+2), so UTC times are 6:00-15:00
  727. sla = Sla.create_or_update(
  728. name: 'test sla 5',
  729. condition: {},
  730. calendar_id: calendar.id,
  731. first_response_time: 120,
  732. update_time: 180,
  733. solution_time: 240,
  734. updated_by_id: 1,
  735. created_by_id: 1,
  736. )
  737. Scheduler.worker(true)
  738. ticket = Ticket.find(ticket.id)
  739. assert_equal(ticket.escalation_at.gmtime.to_s, '2013-10-21 08:00:00 UTC', 'ticket.escalation_at verify 1')
  740. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-10-21 08:00:00 UTC', 'ticket.first_response_escalation_at verify 1')
  741. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-10-21 09:00:00 UTC', 'ticket.update_escalation_at verify 1')
  742. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-10-21 10:00:00 UTC', 'ticket.close_escalation_at verify 1')
  743. ticket = Ticket.create!(
  744. title: 'some title holiday test',
  745. group: Group.lookup(name: 'Users'),
  746. customer_id: 2,
  747. state: Ticket::State.lookup(name: 'new'),
  748. priority: Ticket::Priority.lookup(name: '2 normal'),
  749. created_at: '2015-09-21 14:30:00 UTC',
  750. updated_at: '2015-09-21 14:30:00 UTC',
  751. updated_by_id: 1,
  752. created_by_id: 1,
  753. )
  754. ticket = Ticket.find(ticket.id)
  755. assert_equal(ticket.escalation_at.gmtime.to_s, '2015-09-23 07:30:00 UTC', 'ticket.escalation_at verify 1')
  756. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2015-09-23 07:30:00 UTC', 'ticket.first_response_escalation_at verify 1')
  757. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2015-09-23 08:30:00 UTC', 'ticket.update_escalation_at verify 1')
  758. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2015-09-23 09:30:00 UTC', 'ticket.close_escalation_at verify 1')
  759. delete = sla.destroy!
  760. assert(delete, 'sla destroy')
  761. delete = ticket.destroy!
  762. assert(delete, 'ticket destroy')
  763. calendar.destroy!
  764. end
  765. test 'ticket escalation suspend close reopen bug' do
  766. ticket1 = Ticket.create!(
  767. title: 'some title äöüß3',
  768. group: Group.lookup(name: 'Users'),
  769. customer_id: 2,
  770. state: Ticket::State.lookup(name: 'open'),
  771. priority: Ticket::Priority.lookup(name: '2 normal'),
  772. created_at: '2013-06-04 09:00:00 UTC',
  773. updated_at: '2013-06-04 09:00:00 UTC',
  774. updated_by_id: 1,
  775. created_by_id: 1,
  776. )
  777. assert(ticket1, 'ticket created')
  778. # set ticket at 09:30 to pending
  779. History.add(
  780. history_type: 'updated',
  781. history_object: 'Ticket',
  782. history_attribute: 'state',
  783. o_id: ticket1.id,
  784. id_from: Ticket::State.lookup(name: 'open').id,
  785. id_to: Ticket::State.lookup(name: 'pending reminder').id,
  786. value_from: 'open',
  787. value_to: 'pending reminder',
  788. created_by_id: 1,
  789. created_at: '2013-06-04 09:30:00 UTC',
  790. updated_at: '2013-06-04 09:30:00 UTC',
  791. )
  792. # set ticket at 09:45 to open
  793. History.add(
  794. history_type: 'updated',
  795. history_object: 'Ticket',
  796. history_attribute: 'state',
  797. o_id: ticket1.id,
  798. id_from: Ticket::State.lookup(name: 'pending reminder').id,
  799. id_to: Ticket::State.lookup(name: 'open').id,
  800. value_from: 'pending reminder',
  801. value_to: 'open',
  802. created_by_id: 1,
  803. created_at: '2013-06-04 09:45:00 UTC',
  804. updated_at: '2013-06-04 09:45:00 UTC',
  805. )
  806. # set ticket at 10:00 to closed
  807. History.add(
  808. history_type: 'updated',
  809. history_object: 'Ticket',
  810. history_attribute: 'state',
  811. o_id: ticket1.id,
  812. id_from: Ticket::State.lookup(name: 'open').id,
  813. id_to: Ticket::State.lookup(name: 'closed').id,
  814. value_from: 'open',
  815. value_to: 'closed',
  816. created_by_id: 1,
  817. created_at: '2013-06-04 10:00:00 UTC',
  818. updated_at: '2013-06-04 10:00:00 UTC',
  819. )
  820. # set ticket at 10:30 to open
  821. History.add(
  822. history_type: 'updated',
  823. history_object: 'Ticket',
  824. history_attribute: 'state',
  825. o_id: ticket1.id,
  826. id_from: Ticket::State.lookup(name: 'closed').id,
  827. id_to: Ticket::State.lookup(name: 'open').id,
  828. value_from: 'closed',
  829. value_to: 'open',
  830. created_by_id: 1,
  831. created_at: '2013-06-04 10:30:00 UTC',
  832. updated_at: '2013-06-04 10:30:00 UTC',
  833. )
  834. # set sla's for timezone "Europe/Berlin" summertime (+2), so UTC times are 7:00-16:00
  835. calendar = Calendar.create_or_update(
  836. name: 'EU 5',
  837. timezone: 'Europe/Berlin',
  838. business_hours: {
  839. mon: {
  840. active: true,
  841. timeframes: [ ['09:00', '18:00'] ]
  842. },
  843. tue: {
  844. active: true,
  845. timeframes: [ ['09:00', '18:00'] ]
  846. },
  847. wed: {
  848. active: true,
  849. timeframes: [ ['09:00', '18:00'] ]
  850. },
  851. thu: {
  852. active: true,
  853. timeframes: [ ['09:00', '18:00'] ]
  854. },
  855. fri: {
  856. active: true,
  857. timeframes: [ ['09:00', '18:00'] ]
  858. },
  859. sat: {
  860. active: true,
  861. timeframes: [ ['09:00', '18:00'] ]
  862. },
  863. sun: {
  864. active: true,
  865. timeframes: [ ['09:00', '18:00'] ]
  866. },
  867. },
  868. default: true,
  869. ical_url: nil,
  870. updated_by_id: 1,
  871. created_by_id: 1,
  872. )
  873. sla = Sla.create_or_update(
  874. name: 'test sla suspend bug',
  875. condition: {},
  876. calendar_id: calendar.id,
  877. first_response_time: 120,
  878. update_time: 180,
  879. solution_time: 250,
  880. updated_by_id: 1,
  881. created_by_id: 1,
  882. )
  883. ticket1.escalation_calculation
  884. ticket1 = Ticket.find(ticket1.id)
  885. assert_equal(ticket1.escalation_at.gmtime.to_s, '2013-06-04 11:45:00 UTC', 'ticket1.escalation_at verify 1')
  886. assert_equal(ticket1.first_response_escalation_at.gmtime.to_s, '2013-06-04 11:45:00 UTC', 'ticket1.first_response_escalation_at verify 1')
  887. assert_nil(ticket1.first_response_in_min, 'ticket1.first_response_in_min verify 3')
  888. assert_nil(ticket1.first_response_diff_in_min, 'ticket1.first_response_diff_in_min verify 3')
  889. ticket2 = Ticket.create!(
  890. title: 'some title äöüß4',
  891. group: Group.lookup(name: 'Users'),
  892. customer_id: 2,
  893. state: Ticket::State.lookup(name: 'open'),
  894. priority: Ticket::Priority.lookup(name: '2 normal'),
  895. created_at: '2013-06-04 09:00:00 UTC',
  896. updated_at: '2013-06-04 09:00:00 UTC',
  897. updated_by_id: 1,
  898. created_by_id: 1,
  899. )
  900. assert(ticket2, 'ticket created')
  901. # set ticket at 10:00 to pending
  902. History.add(
  903. history_type: 'updated',
  904. history_object: 'Ticket',
  905. history_attribute: 'state',
  906. o_id: ticket2.id,
  907. id_from: Ticket::State.lookup(name: 'open').id,
  908. id_to: Ticket::State.lookup(name: 'pending reminder').id,
  909. value_from: 'open',
  910. value_to: 'pending reminder',
  911. created_by_id: 1,
  912. created_at: '2013-06-04 10:00:00 UTC',
  913. updated_at: '2013-06-04 10:00:00 UTC',
  914. )
  915. # set ticket at 15:00 to open
  916. History.add(
  917. history_type: 'updated',
  918. history_object: 'Ticket',
  919. history_attribute: 'state',
  920. o_id: ticket2.id,
  921. id_from: Ticket::State.lookup(name: 'pending reminder').id,
  922. id_to: Ticket::State.lookup(name: 'open').id,
  923. value_from: 'pending reminder',
  924. value_to: 'open',
  925. created_by_id: 1,
  926. created_at: '2013-06-04 15:00:00 UTC',
  927. updated_at: '2013-06-04 15:00:00 UTC',
  928. )
  929. ticket2.escalation_calculation(true)
  930. ticket2 = Ticket.find(ticket2.id)
  931. assert_equal(ticket2.escalation_at.gmtime.to_s, '2013-06-04 16:00:00 UTC', 'ticket2.escalation_at verify 1')
  932. assert_equal(ticket2.first_response_escalation_at.gmtime.to_s, '2013-06-04 16:00:00 UTC', 'ticket2.first_response_escalation_at verify 1')
  933. assert_nil(ticket2.first_response_in_min, 'ticket2.first_response_in_min verify 3')
  934. assert_nil(ticket2.first_response_diff_in_min, 'ticket2.first_response_diff_in_min verify 3')
  935. delete = sla.destroy!
  936. assert(delete, 'sla destroy')
  937. delete = ticket1.destroy!
  938. assert(delete, 'ticket1 destroy')
  939. delete = ticket2.destroy!
  940. assert(delete, 'ticket2 destroy')
  941. calendar.destroy!
  942. end
  943. test 'ticket escalation suspend' do
  944. ticket = Ticket.create!(
  945. title: 'some title äöüß3',
  946. group: Group.lookup(name: 'Users'),
  947. customer_id: 2,
  948. state: Ticket::State.lookup(name: 'new'),
  949. priority: Ticket::Priority.lookup(name: '2 normal'),
  950. created_at: '2013-06-04 09:00:00 UTC',
  951. updated_at: '2013-06-04 09:00:00 UTC',
  952. updated_by_id: 1,
  953. created_by_id: 1,
  954. )
  955. assert(ticket, 'ticket created')
  956. # set ticket at 10:00 to pending
  957. History.add(
  958. history_type: 'updated',
  959. history_object: 'Ticket',
  960. history_attribute: 'state',
  961. o_id: ticket.id,
  962. id_to: 3,
  963. id_from: 2,
  964. value_from: 'open',
  965. value_to: 'pending reminder',
  966. created_by_id: 1,
  967. created_at: '2013-06-04 10:00:00 UTC',
  968. updated_at: '2013-06-04 10:00:00 UTC',
  969. )
  970. # set ticket at 10:30 to open
  971. History.add(
  972. history_type: 'updated',
  973. history_object: 'Ticket',
  974. history_attribute: 'state',
  975. o_id: ticket.id,
  976. id_to: 2,
  977. id_from: 3,
  978. value_from: 'pending reminder',
  979. value_to: 'open',
  980. created_by_id: 1,
  981. created_at: '2013-06-04 10:30:00 UTC',
  982. updated_at: '2013-06-04 10:30:00 UTC'
  983. )
  984. # set update time
  985. ticket.update!(
  986. last_contact_agent_at: '2013-06-04 10:15:00 UTC',
  987. )
  988. # set first response time
  989. ticket.update!(
  990. first_response_at: '2013-06-04 10:45:00 UTC',
  991. )
  992. # set ticket from 11:30 to closed
  993. History.add(
  994. history_type: 'updated',
  995. history_object: 'Ticket',
  996. history_attribute: 'state',
  997. o_id: ticket.id,
  998. id_to: 3,
  999. id_from: 2,
  1000. value_from: 'open',
  1001. value_to: 'closed',
  1002. created_by_id: 1,
  1003. created_at: '2013-06-04 12:00:00 UTC',
  1004. updated_at: '2013-06-04 12:00:00 UTC'
  1005. )
  1006. ticket.update!(
  1007. close_at: '2013-06-04 12:00:00 UTC',
  1008. )
  1009. # set sla's for timezone "Europe/Berlin" summertime (+2), so UTC times are 7:00-16:00
  1010. calendar = Calendar.create_or_update(
  1011. name: 'EU 5',
  1012. timezone: 'Europe/Berlin',
  1013. business_hours: {
  1014. mon: {
  1015. active: true,
  1016. timeframes: [ ['09:00', '18:00'] ]
  1017. },
  1018. tue: {
  1019. active: true,
  1020. timeframes: [ ['09:00', '18:00'] ]
  1021. },
  1022. wed: {
  1023. active: true,
  1024. timeframes: [ ['09:00', '18:00'] ]
  1025. },
  1026. thu: {
  1027. active: true,
  1028. timeframes: [ ['09:00', '18:00'] ]
  1029. },
  1030. fri: {
  1031. active: true,
  1032. timeframes: [ ['09:00', '18:00'] ]
  1033. },
  1034. sat: {
  1035. active: true,
  1036. timeframes: [ ['09:00', '18:00'] ]
  1037. },
  1038. sun: {
  1039. active: true,
  1040. timeframes: [ ['09:00', '18:00'] ]
  1041. },
  1042. },
  1043. default: true,
  1044. ical_url: nil,
  1045. updated_by_id: 1,
  1046. created_by_id: 1,
  1047. )
  1048. sla = Sla.create_or_update(
  1049. name: 'test sla 5',
  1050. condition: {},
  1051. calendar_id: calendar.id,
  1052. first_response_time: 120,
  1053. update_time: 180,
  1054. solution_time: 250,
  1055. updated_by_id: 1,
  1056. created_by_id: 1,
  1057. )
  1058. Scheduler.worker(true)
  1059. ticket = Ticket.find(ticket.id)
  1060. assert_equal(ticket.escalation_at.gmtime.to_s, '2013-06-04 13:30:00 UTC', 'ticket.escalation_at verify 1')
  1061. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-06-04 11:30:00 UTC', 'ticket.first_response_escalation_at verify 1')
  1062. assert_equal(ticket.first_response_in_min, 75, 'ticket.first_response_in_min verify 3')
  1063. assert_equal(ticket.first_response_diff_in_min, 45, 'ticket.first_response_diff_in_min verify 3')
  1064. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-06-04 13:30:00 UTC', 'ticket.update_escalation_at verify 1')
  1065. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-06-04 13:40:00 UTC', 'ticket.close_escalation_at verify 1')
  1066. assert_equal(ticket.close_in_min, 150, 'ticket.close_in_min verify 3')
  1067. assert_equal(ticket.close_diff_in_min, 100, 'ticket.close_diff_in_min# verify 3')
  1068. delete = sla.destroy
  1069. assert(delete, 'sla destroy')
  1070. delete = ticket.destroy
  1071. assert(delete, 'ticket destroy')
  1072. # test Ticket created in state pending and closed without reopen or state change
  1073. ticket = Ticket.create!(
  1074. title: 'some title äöüß3',
  1075. group: Group.lookup(name: 'Users'),
  1076. customer_id: 2,
  1077. state: Ticket::State.lookup(name: 'pending reminder'),
  1078. priority: Ticket::Priority.lookup(name: '2 normal'),
  1079. created_at: '2013-06-04 09:00:00 UTC',
  1080. updated_at: '2013-06-04 09:00:00 UTC',
  1081. updated_by_id: 1,
  1082. created_by_id: 1,
  1083. )
  1084. assert(ticket, 'ticket created')
  1085. # set ticket from 11:30 to closed
  1086. History.add(
  1087. history_type: 'updated',
  1088. history_object: 'Ticket',
  1089. history_attribute: 'state',
  1090. o_id: ticket.id,
  1091. id_to: 4,
  1092. id_from: 3,
  1093. value_from: 'pending reminder',
  1094. value_to: 'closed',
  1095. created_by_id: 1,
  1096. created_at: '2013-06-04 12:00:00 UTC',
  1097. updated_at: '2013-06-04 12:00:00 UTC',
  1098. )
  1099. ticket.update!(
  1100. close_at: '2013-06-04 12:00:00 UTC',
  1101. )
  1102. ticket.escalation_calculation(true)
  1103. calendar = Calendar.create_or_update(
  1104. name: 'EU 5',
  1105. timezone: 'Europe/Berlin',
  1106. business_hours: {
  1107. mon: {
  1108. active: true,
  1109. timeframes: [ ['09:00', '18:00'] ]
  1110. },
  1111. tue: {
  1112. active: true,
  1113. timeframes: [ ['09:00', '18:00'] ]
  1114. },
  1115. wed: {
  1116. active: true,
  1117. timeframes: [ ['09:00', '18:00'] ]
  1118. },
  1119. thu: {
  1120. active: true,
  1121. timeframes: [ ['09:00', '18:00'] ]
  1122. },
  1123. fri: {
  1124. active: true,
  1125. timeframes: [ ['09:00', '18:00'] ]
  1126. },
  1127. sat: {
  1128. active: true,
  1129. timeframes: [ ['09:00', '18:00'] ]
  1130. },
  1131. sun: {
  1132. active: true,
  1133. timeframes: [ ['09:00', '18:00'] ]
  1134. },
  1135. },
  1136. default: true,
  1137. ical_url: nil,
  1138. updated_by_id: 1,
  1139. created_by_id: 1,
  1140. )
  1141. sla = Sla.create_or_update(
  1142. name: 'test sla 5',
  1143. condition: {},
  1144. calendar_id: calendar.id,
  1145. first_response_time: 120,
  1146. update_time: 180,
  1147. solution_time: 240,
  1148. updated_by_id: 1,
  1149. created_by_id: 1,
  1150. )
  1151. Scheduler.worker(true)
  1152. ticket = Ticket.find(ticket.id)
  1153. assert_nil(ticket.escalation_at, 'ticket.escalation_at verify 1')
  1154. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-06-04 14:00:00 UTC', 'ticket.first_response_escalation_at verify 1')
  1155. assert_nil(ticket.first_response_in_min, 'ticket.first_response_in_min verify 3')
  1156. assert_nil(ticket.first_response_diff_in_min, 'ticket.first_response_diff_in_min verify 3')
  1157. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-06-04 15:00:00 UTC', 'ticket.update_escalation_at verify 1')
  1158. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-06-04 16:00:00 UTC', 'ticket.close_escalation_at verify 1')
  1159. assert_equal(ticket.close_in_min, 0, 'ticket.close_in_min verify 3')
  1160. assert_equal(ticket.close_diff_in_min, 240, 'ticket.close_diff_in_min# verify 3')
  1161. delete = sla.destroy
  1162. assert(delete, 'sla destroy')
  1163. delete = ticket.destroy
  1164. assert(delete, 'ticket destroy')
  1165. # test Ticket created in state pending, changed state to openen, back to pending and closed
  1166. ticket = Ticket.create!(
  1167. title: 'some title äöüß3',
  1168. group: Group.lookup(name: 'Users'),
  1169. customer_id: 2,
  1170. state: Ticket::State.lookup(name: 'pending reminder'),
  1171. priority: Ticket::Priority.lookup(name: '2 normal'),
  1172. created_at: '2013-06-04 09:00:00 UTC',
  1173. updated_at: '2013-06-04 09:00:00 UTC',
  1174. updated_by_id: 1,
  1175. created_by_id: 1,
  1176. )
  1177. assert(ticket, 'ticket created')
  1178. # state change to open 10:30
  1179. History.add(
  1180. history_type: 'updated',
  1181. history_object: 'Ticket',
  1182. history_attribute: 'state',
  1183. o_id: ticket.id,
  1184. id_to: 2,
  1185. id_from: 3,
  1186. value_from: 'pending reminder',
  1187. value_to: 'open',
  1188. created_by_id: 1,
  1189. created_at: '2013-06-04 10:30:00 UTC',
  1190. updated_at: '2013-06-04 10:30:00 UTC',
  1191. )
  1192. # state change to pending 11:00
  1193. History.add(
  1194. history_type: 'updated',
  1195. history_object: 'Ticket',
  1196. history_attribute: 'state',
  1197. o_id: ticket.id,
  1198. id_to: 3,
  1199. id_from: 2,
  1200. value_from: 'open',
  1201. value_to: 'pending reminder',
  1202. created_by_id: 1,
  1203. created_at: '2013-06-04 11:00:00 UTC',
  1204. updated_at: '2013-06-04 11:00:00 UTC',
  1205. )
  1206. # set ticket from 12:00 to closed
  1207. History.add(
  1208. history_type: 'updated',
  1209. history_object: 'Ticket',
  1210. history_attribute: 'state',
  1211. o_id: ticket.id,
  1212. id_to: 4,
  1213. id_from: 3,
  1214. value_from: 'pending reminder',
  1215. value_to: 'closed',
  1216. created_by_id: 1,
  1217. created_at: '2013-06-04 12:00:00 UTC',
  1218. updated_at: '2013-06-04 12:00:00 UTC',
  1219. )
  1220. ticket.update!(
  1221. close_at: '2013-06-04 12:00:00 UTC',
  1222. )
  1223. calendar = Calendar.create_or_update(
  1224. name: 'EU 5',
  1225. timezone: 'Europe/Berlin',
  1226. business_hours: {
  1227. mon: {
  1228. active: true,
  1229. timeframes: [ ['09:00', '18:00'] ]
  1230. },
  1231. tue: {
  1232. active: true,
  1233. timeframes: [ ['09:00', '18:00'] ]
  1234. },
  1235. wed: {
  1236. active: true,
  1237. timeframes: [ ['09:00', '18:00'] ]
  1238. },
  1239. thu: {
  1240. active: true,
  1241. timeframes: [ ['09:00', '18:00'] ]
  1242. },
  1243. fri: {
  1244. active: true,
  1245. timeframes: [ ['09:00', '18:00'] ]
  1246. },
  1247. sat: {
  1248. active: true,
  1249. timeframes: [ ['09:00', '18:00'] ]
  1250. },
  1251. sun: {
  1252. active: true,
  1253. timeframes: [ ['09:00', '18:00'] ]
  1254. },
  1255. },
  1256. default: true,
  1257. ical_url: nil,
  1258. updated_by_id: 1,
  1259. created_by_id: 1,
  1260. )
  1261. sla = Sla.create_or_update(
  1262. name: 'test sla 5',
  1263. condition: {},
  1264. calendar_id: calendar.id,
  1265. first_response_time: 120,
  1266. update_time: 180,
  1267. solution_time: 240,
  1268. updated_by_id: 1,
  1269. created_by_id: 1,
  1270. )
  1271. Scheduler.worker(true)
  1272. ticket = Ticket.find(ticket.id)
  1273. assert_nil(ticket.escalation_at, 'ticket.escalation_at verify 1')
  1274. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-06-04 13:30:00 UTC', 'ticket.first_response_escalation_at verify 1')
  1275. assert_nil(ticket.first_response_in_min, 'ticket.first_response_in_min verify 3')
  1276. assert_nil(ticket.first_response_diff_in_min, 'ticket.first_response_diff_in_min verify 3')
  1277. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-06-04 14:30:00 UTC', 'ticket.update_escalation_at verify 1')
  1278. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-06-04 15:30:00 UTC', 'ticket.close_escalation_at verify 1')
  1279. assert_equal(ticket.close_in_min, 30, 'ticket.close_in_min verify 3')
  1280. assert_equal(ticket.close_diff_in_min, 210, 'ticket.close_diff_in_min# verify 3')
  1281. delete = sla.destroy
  1282. assert(delete, 'sla destroy')
  1283. delete = ticket.destroy
  1284. assert(delete, 'ticket destroy')
  1285. ### Test Ticket created in state pending, changed state to openen, back to pending and back to open then
  1286. ### close ticket
  1287. ticket = Ticket.create!(
  1288. title: 'some title äöüß3',
  1289. group: Group.lookup(name: 'Users'),
  1290. customer_id: 2,
  1291. state: Ticket::State.lookup(name: 'pending reminder'),
  1292. priority: Ticket::Priority.lookup(name: '2 normal'),
  1293. created_at: '2013-06-04 09:00:00 UTC',
  1294. updated_at: '2013-06-04 09:00:00 UTC',
  1295. updated_by_id: 1,
  1296. created_by_id: 1,
  1297. )
  1298. assert(ticket, 'ticket created')
  1299. # state change to open from pending
  1300. History.add(
  1301. history_type: 'updated',
  1302. history_object: 'Ticket',
  1303. history_attribute: 'state',
  1304. o_id: ticket.id,
  1305. id_to: 2,
  1306. id_from: 3,
  1307. value_from: 'pending reminder',
  1308. value_to: 'open',
  1309. created_by_id: 1,
  1310. created_at: '2013-06-04 10:30:00 UTC',
  1311. updated_at: '2013-06-04 10:30:00 UTC',
  1312. )
  1313. # state change to pending from open 11:00
  1314. History.add(
  1315. history_type: 'updated',
  1316. history_object: 'Ticket',
  1317. history_attribute: 'state',
  1318. o_id: ticket.id,
  1319. id_to: 3,
  1320. id_from: 2,
  1321. value_from: 'open',
  1322. value_to: 'pending reminder',
  1323. created_by_id: 1,
  1324. created_at: '2013-06-04 11:00:00 UTC',
  1325. updated_at: '2013-06-04 11:00:00 UTC',
  1326. )
  1327. # state change to open 11:30
  1328. History.add(
  1329. history_type: 'updated',
  1330. history_object: 'Ticket',
  1331. history_attribute: 'state',
  1332. o_id: ticket.id,
  1333. id_to: 2,
  1334. id_from: 3,
  1335. value_from: 'pending reminder',
  1336. value_to: 'open',
  1337. created_by_id: 1,
  1338. created_at: '2013-06-04 11:30:00 UTC',
  1339. updated_at: '2013-06-04 11:30:00 UTC',
  1340. )
  1341. # set ticket from open to closed 12:00
  1342. History.add(
  1343. history_type: 'updated',
  1344. history_object: 'Ticket',
  1345. history_attribute: 'state',
  1346. o_id: ticket.id,
  1347. id_to: 4,
  1348. id_from: 3,
  1349. value_from: 'open',
  1350. value_to: 'closed',
  1351. created_by_id: 1,
  1352. created_at: '2013-06-04 12:00:00 UTC',
  1353. updated_at: '2013-06-04 12:00:00 UTC',
  1354. )
  1355. ticket.update!(
  1356. close_at: '2013-06-04 12:00:00 UTC',
  1357. )
  1358. calendar = Calendar.create_or_update(
  1359. name: 'EU 5',
  1360. timezone: 'Europe/Berlin',
  1361. business_hours: {
  1362. mon: {
  1363. active: true,
  1364. timeframes: [ ['09:00', '18:00'] ]
  1365. },
  1366. tue: {
  1367. active: true,
  1368. timeframes: [ ['09:00', '18:00'] ]
  1369. },
  1370. wed: {
  1371. active: true,
  1372. timeframes: [ ['09:00', '18:00'] ]
  1373. },
  1374. thu: {
  1375. active: true,
  1376. timeframes: [ ['09:00', '18:00'] ]
  1377. },
  1378. fri: {
  1379. active: true,
  1380. timeframes: [ ['09:00', '18:00'] ]
  1381. },
  1382. sat: {
  1383. active: true,
  1384. timeframes: [ ['09:00', '18:00'] ]
  1385. },
  1386. sun: {
  1387. active: true,
  1388. timeframes: [ ['09:00', '18:00'] ]
  1389. },
  1390. },
  1391. default: true,
  1392. ical_url: nil,
  1393. updated_by_id: 1,
  1394. created_by_id: 1,
  1395. )
  1396. sla = Sla.create_or_update(
  1397. name: 'test sla 5',
  1398. condition: {},
  1399. calendar_id: calendar.id,
  1400. first_response_time: 120,
  1401. update_time: 180,
  1402. solution_time: 240,
  1403. updated_by_id: 1,
  1404. created_by_id: 1,
  1405. )
  1406. Scheduler.worker(true)
  1407. ticket = Ticket.find(ticket.id)
  1408. assert_nil(ticket.escalation_at, 'ticket.escalation_at verify 1')
  1409. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2013-06-04 13:00:00 UTC', 'ticket.first_response_escalation_at verify 1')
  1410. assert_nil(ticket.first_response_in_min, 'ticket.first_response_in_min verify 3')
  1411. assert_nil(ticket.first_response_diff_in_min, 'ticket.first_response_diff_in_min verify 3')
  1412. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2013-06-04 14:00:00 UTC', 'ticket.update_escalation_at verify 1')
  1413. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2013-06-04 15:00:00 UTC', 'ticket.close_escalation_at verify 1')
  1414. assert_equal(ticket.close_in_min, 60, 'ticket.close_in_min verify 3')
  1415. assert_equal(ticket.close_diff_in_min, 180, 'ticket.close_diff_in_min# verify 3')
  1416. delete = sla.destroy!
  1417. assert(delete, 'sla destroy')
  1418. delete = ticket.destroy!
  1419. assert(delete, 'ticket destroy')
  1420. calendar.destroy!
  1421. end
  1422. test 'ticket ticket.title and article.subject' do
  1423. ticket = Ticket.create!(
  1424. title: 'some title SLATEST1 for you',
  1425. group: Group.lookup(name: 'Users'),
  1426. customer_id: 2,
  1427. state: Ticket::State.lookup(name: 'new'),
  1428. priority: Ticket::Priority.lookup(name: '2 normal'),
  1429. created_at: '2016-03-21 12:30:00 UTC',
  1430. updated_at: '2016-03-21 12:30:00 UTC',
  1431. updated_by_id: 1,
  1432. created_by_id: 1,
  1433. )
  1434. article_inbound = Ticket::Article.create!(
  1435. ticket_id: ticket.id,
  1436. from: 'some_sender@example.com',
  1437. to: 'some_recipient@example.com',
  1438. subject: 'some title SLATEST2 for you',
  1439. message_id: 'some@id',
  1440. body: 'some message',
  1441. internal: false,
  1442. sender: Ticket::Article::Sender.where(name: 'Customer').first,
  1443. type: Ticket::Article::Type.where(name: 'email').first,
  1444. updated_by_id: 1,
  1445. created_by_id: 1,
  1446. created_at: '2016-03-21 12:30:00 UTC',
  1447. updated_at: '2016-03-21 12:30:00 UTC',
  1448. )
  1449. calendar = Calendar.create_or_update(
  1450. name: 'EU 5',
  1451. timezone: 'Europe/Berlin',
  1452. business_hours: {
  1453. mon: {
  1454. active: true,
  1455. timeframes: [ ['09:00', '18:00'] ]
  1456. },
  1457. tue: {
  1458. active: true,
  1459. timeframes: [ ['09:00', '18:00'] ]
  1460. },
  1461. wed: {
  1462. active: true,
  1463. timeframes: [ ['09:00', '18:00'] ]
  1464. },
  1465. thu: {
  1466. active: true,
  1467. timeframes: [ ['09:00', '18:00'] ]
  1468. },
  1469. fri: {
  1470. active: true,
  1471. timeframes: [ ['09:00', '18:00'] ]
  1472. },
  1473. sat: {
  1474. active: true,
  1475. timeframes: [ ['09:00', '18:00'] ]
  1476. },
  1477. sun: {
  1478. active: true,
  1479. timeframes: [ ['09:00', '18:00'] ]
  1480. },
  1481. },
  1482. default: true,
  1483. ical_url: nil,
  1484. updated_by_id: 1,
  1485. created_by_id: 1,
  1486. )
  1487. sla = Sla.create_or_update(
  1488. name: 'test sla - ticket.title & article.subject',
  1489. condition: {
  1490. 'ticket.priority_id' => {
  1491. operator: 'is',
  1492. value: %w[1 2 3],
  1493. },
  1494. 'article.subject' => {
  1495. operator: 'contains',
  1496. value: 'SLATEST2',
  1497. },
  1498. },
  1499. calendar_id: calendar.id,
  1500. first_response_time: 60,
  1501. update_time: 120,
  1502. solution_time: 180,
  1503. updated_by_id: 1,
  1504. created_by_id: 1,
  1505. )
  1506. Scheduler.worker(true)
  1507. ticket = Ticket.find(ticket.id)
  1508. assert_equal(ticket.escalation_at.gmtime.to_s, '2016-03-21 13:30:00 UTC', 'ticket.escalation_at verify 1')
  1509. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2016-03-21 13:30:00 UTC', 'ticket.first_response_escalation_at verify 1')
  1510. assert_nil(ticket.first_response_in_min, 'ticket.first_response_in_min verify 3')
  1511. assert_nil(ticket.first_response_diff_in_min, 'ticket.first_response_diff_in_min verify 3')
  1512. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2016-03-21 14:30:00 UTC', 'ticket.update_escalation_at verify 1')
  1513. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2016-03-21 15:30:00 UTC', 'ticket.close_escalation_at verify 1')
  1514. assert_nil(ticket.close_in_min, 'ticket.close_in_min verify 3')
  1515. assert_nil(ticket.close_diff_in_min, 'ticket.close_diff_in_min# verify 3')
  1516. sla = Sla.create_or_update(
  1517. name: 'test sla - ticket.title & article.subject',
  1518. condition: {
  1519. 'ticket.priority_id' => {
  1520. operator: 'is',
  1521. value: %w[1 2 3],
  1522. },
  1523. 'ticket.title' => {
  1524. operator: 'contains',
  1525. value: 'SLATEST1',
  1526. },
  1527. },
  1528. calendar_id: calendar.id,
  1529. first_response_time: 60,
  1530. update_time: 120,
  1531. solution_time: 180,
  1532. updated_by_id: 1,
  1533. created_by_id: 1,
  1534. )
  1535. Scheduler.worker(true)
  1536. ticket = Ticket.find(ticket.id)
  1537. assert_equal(ticket.escalation_at.gmtime.to_s, '2016-03-21 13:30:00 UTC', 'ticket.escalation_at verify 1')
  1538. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2016-03-21 13:30:00 UTC', 'ticket.first_response_escalation_at verify 1')
  1539. assert_nil(ticket.first_response_in_min, 'ticket.first_response_in_min verify 3')
  1540. assert_nil(ticket.first_response_diff_in_min, 'ticket.first_response_diff_in_min verify 3')
  1541. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2016-03-21 14:30:00 UTC', 'ticket.update_escalation_at verify 1')
  1542. assert_equal(ticket.close_escalation_at.gmtime.to_s, '2016-03-21 15:30:00 UTC', 'ticket.close_escalation_at verify 1')
  1543. assert_nil(ticket.close_in_min, 'ticket.close_in_min verify 3')
  1544. assert_nil(ticket.close_diff_in_min, 'ticket.close_diff_in_min# verify 3')
  1545. sla = Sla.create_or_update(
  1546. name: 'test sla - ticket.title & article.subject',
  1547. condition: {
  1548. 'ticket.priority_id' => {
  1549. operator: 'is',
  1550. value: %w[1 2 3],
  1551. },
  1552. 'ticket.title' => {
  1553. operator: 'contains',
  1554. value: 'SLATEST2',
  1555. },
  1556. },
  1557. calendar_id: calendar.id,
  1558. first_response_time: 60,
  1559. update_time: 120,
  1560. solution_time: 180,
  1561. updated_by_id: 1,
  1562. created_by_id: 1,
  1563. )
  1564. Scheduler.worker(true)
  1565. ticket = Ticket.find(ticket.id)
  1566. assert_nil(ticket.escalation_at, 'ticket.escalation_at verify 1')
  1567. assert_nil(ticket.first_response_escalation_at, 'ticket.first_response_escalation_at verify 1')
  1568. assert_nil(ticket.first_response_in_min, 'ticket.first_response_in_min verify 3')
  1569. assert_nil(ticket.first_response_diff_in_min, 'ticket.first_response_diff_in_min verify 3')
  1570. assert_nil(ticket.update_escalation_at, 'ticket.update_escalation_at verify 1')
  1571. assert_nil(ticket.close_escalation_at, 'ticket.close_escalation_at verify 1')
  1572. assert_nil(ticket.close_in_min, 'ticket.close_in_min verify 3')
  1573. assert_nil(ticket.close_diff_in_min, 'ticket.close_diff_in_min# verify 3')
  1574. delete = sla.destroy!
  1575. assert(delete, 'sla destroy')
  1576. delete = ticket.destroy!
  1577. assert(delete, 'ticket destroy')
  1578. calendar.destroy!
  1579. end
  1580. test 'ticket sla + holiday 222' do
  1581. ticket = Ticket.create!(
  1582. title: 'some title 222',
  1583. group: Group.lookup(name: 'Users'),
  1584. customer_id: 2,
  1585. state: Ticket::State.lookup(name: 'new'),
  1586. priority: Ticket::Priority.lookup(name: '2 normal'),
  1587. created_at: '2016-11-01 13:56:21 UTC',
  1588. updated_at: '2016-11-01 13:56:21 UTC',
  1589. updated_by_id: 1,
  1590. created_by_id: 1,
  1591. )
  1592. assert(ticket, 'ticket created')
  1593. assert_nil(ticket.escalation_at, 'ticket.escalation_at verify')
  1594. article_customer = Ticket::Article.create!(
  1595. ticket_id: ticket.id,
  1596. from: 'some_sender@example.com',
  1597. to: 'some_recipient@example.com',
  1598. subject: 'some subject',
  1599. message_id: 'some@id',
  1600. body: 'some message',
  1601. internal: false,
  1602. sender: Ticket::Article::Sender.where(name: 'Customer').first,
  1603. type: Ticket::Article::Type.where(name: 'web').first,
  1604. updated_by_id: 1,
  1605. created_by_id: 1,
  1606. created_at: '2016-11-01 13:56:21 UTC',
  1607. updated_at: '2016-11-01 13:56:21 UTC',
  1608. )
  1609. # set sla's for timezone "Europe/Berlin" wintertime (+1), so UTC times are 7:00-18:00
  1610. calendar = Calendar.create_or_update(
  1611. name: 'EU',
  1612. timezone: 'Europe/Berlin',
  1613. business_hours: {
  1614. mon: {
  1615. active: true,
  1616. timeframes: [ ['08:00', '20:00'] ]
  1617. },
  1618. tue: {
  1619. active: true,
  1620. timeframes: [ ['08:00', '20:00'] ]
  1621. },
  1622. wed: {
  1623. active: true,
  1624. timeframes: [ ['08:00', '20:00'] ]
  1625. },
  1626. thu: {
  1627. active: true,
  1628. timeframes: [ ['08:00', '20:00'] ]
  1629. },
  1630. fri: {
  1631. active: true,
  1632. timeframes: [ ['08:00', '20:00'] ]
  1633. },
  1634. sat: {
  1635. active: false,
  1636. timeframes: [ ['08:00', '17:00'] ]
  1637. },
  1638. sun: {
  1639. active: false,
  1640. timeframes: [ ['08:00', '17:00'] ]
  1641. },
  1642. },
  1643. public_holidays: {
  1644. '2016-11-01' => {
  1645. 'active' => true,
  1646. 'summary' => 'test 1',
  1647. },
  1648. },
  1649. default: true,
  1650. ical_url: nil,
  1651. updated_by_id: 1,
  1652. created_by_id: 1,
  1653. )
  1654. sla = Sla.create_or_update(
  1655. name: 'test sla 1',
  1656. condition: {},
  1657. calendar_id: calendar.id,
  1658. first_response_time: 120,
  1659. update_time: 1200,
  1660. solution_time: nil,
  1661. updated_by_id: 1,
  1662. created_by_id: 1,
  1663. )
  1664. Scheduler.worker(true)
  1665. ticket = Ticket.find(ticket.id)
  1666. assert_equal(ticket.escalation_at.gmtime.to_s, '2016-11-02 09:00:00 UTC', 'ticket.escalation_at verify 1')
  1667. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2016-11-02 09:00:00 UTC', 'ticket.first_response_escalation_at verify 1')
  1668. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2016-11-03 15:00:00 UTC', 'ticket.update_escalation_at verify 1')
  1669. assert_nil(ticket.close_escalation_at, 'ticket.close_escalation_at verify 1')
  1670. ticket.state = Ticket::State.lookup(name: 'pending reminder')
  1671. ticket.pending_time = '2016-11-10 07:00:00 UTC'
  1672. ticket.updated_at = '2016-11-01 15:25:40 UTC'
  1673. ticket.save!
  1674. article_agent = Ticket::Article.create!(
  1675. ticket_id: ticket.id,
  1676. from: 'some_sender@example.com',
  1677. to: 'some_recipient@example.com',
  1678. subject: 'some subject',
  1679. message_id: 'some@id',
  1680. body: 'some message',
  1681. internal: false,
  1682. sender: Ticket::Article::Sender.where(name: 'Agent').first,
  1683. type: Ticket::Article::Type.where(name: 'email').first,
  1684. updated_by_id: 1,
  1685. created_by_id: 1,
  1686. created_at: '2016-11-01 15:25:40 UTC',
  1687. updated_at: '2016-11-01 15:25:40 UTC',
  1688. )
  1689. Scheduler.worker(true)
  1690. ticket = Ticket.find(ticket.id)
  1691. assert_nil(ticket.escalation_at, 'ticket.escalation_at verify 1')
  1692. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2016-11-02 09:00:00 UTC', 'ticket.first_response_escalation_at verify 1')
  1693. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2016-11-03 15:00:00 UTC', 'ticket.update_escalation_at verify 1')
  1694. assert_nil(ticket.close_escalation_at, 'ticket.close_escalation_at verify 1')
  1695. ticket.state = Ticket::State.lookup(name: 'open')
  1696. ticket.updated_at = '2016-11-01 15:59:14 UTC'
  1697. ticket.save!
  1698. article_customer = Ticket::Article.create!(
  1699. ticket_id: ticket.id,
  1700. from: 'some_sender@example.com',
  1701. to: 'some_recipient@example.com',
  1702. subject: 'some subject',
  1703. message_id: 'some@id',
  1704. body: 'some message',
  1705. internal: false,
  1706. sender: Ticket::Article::Sender.where(name: 'Customer').first,
  1707. type: Ticket::Article::Type.where(name: 'email').first,
  1708. updated_by_id: 1,
  1709. created_by_id: 1,
  1710. created_at: '2016-11-01 15:59:14 UTC',
  1711. updated_at: '2016-11-01 15:59:14 UTC',
  1712. )
  1713. Scheduler.worker(true)
  1714. ticket = Ticket.find(ticket.id)
  1715. assert_equal(ticket.escalation_at.gmtime.to_s, '2016-11-03 15:00:00 UTC', 'ticket.escalation_at verify 1')
  1716. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2016-11-02 09:00:00 UTC', 'ticket.first_response_escalation_at verify 1')
  1717. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2016-11-03 15:00:00 UTC', 'ticket.update_escalation_at verify 1')
  1718. assert_nil(ticket.close_escalation_at, 'ticket.close_escalation_at verify 1')
  1719. ticket.state = Ticket::State.lookup(name: 'pending reminder')
  1720. ticket.pending_time = '2016-11-18 07:00:00 UTC'
  1721. ticket.updated_at = '2016-11-01 15:59:58 UTC'
  1722. ticket.save!
  1723. Scheduler.worker(true)
  1724. ticket = Ticket.find(ticket.id)
  1725. assert_nil(ticket.escalation_at, 'ticket.escalation_at verify 1')
  1726. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2016-11-02 09:00:00 UTC', 'ticket.first_response_escalation_at verify 1')
  1727. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2016-11-03 15:00:00 UTC', 'ticket.update_escalation_at verify 1')
  1728. assert_nil(ticket.close_escalation_at, 'ticket.close_escalation_at verify 1')
  1729. ticket.state = Ticket::State.lookup(name: 'open')
  1730. ticket.updated_at = '2016-11-07 13:26:36 UTC'
  1731. ticket.save!
  1732. article_customer = Ticket::Article.create!(
  1733. ticket_id: ticket.id,
  1734. from: 'some_sender@example.com',
  1735. to: 'some_recipient@example.com',
  1736. subject: 'some subject',
  1737. message_id: 'some@id',
  1738. body: 'some message',
  1739. internal: false,
  1740. sender: Ticket::Article::Sender.where(name: 'Agent').first,
  1741. type: Ticket::Article::Type.where(name: 'email').first,
  1742. updated_by_id: 1,
  1743. created_by_id: 1,
  1744. created_at: '2016-11-07 13:26:36 UTC',
  1745. updated_at: '2016-11-07 13:26:36 UTC',
  1746. )
  1747. Scheduler.worker(true)
  1748. ticket = Ticket.find(ticket.id)
  1749. assert_equal(ticket.escalation_at.gmtime.to_s, '2016-11-09 09:26:36 UTC', 'ticket.escalation_at verify 1')
  1750. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2016-11-02 09:00:00 UTC', 'ticket.first_response_escalation_at verify 1')
  1751. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2016-11-09 09:26:36 UTC', 'ticket.update_escalation_at verify 1')
  1752. assert_nil(ticket.close_escalation_at, 'ticket.close_escalation_at verify 1')
  1753. article_agent = Ticket::Article.create!(
  1754. ticket_id: ticket.id,
  1755. from: 'some_sender@example.com',
  1756. to: 'some_recipient@example.com',
  1757. subject: 'some subject',
  1758. message_id: 'some@id',
  1759. body: 'some message',
  1760. internal: false,
  1761. sender: Ticket::Article::Sender.where(name: 'Agent').first,
  1762. type: Ticket::Article::Type.where(name: 'email').first,
  1763. updated_by_id: 1,
  1764. created_by_id: 1,
  1765. created_at: '2016-11-07 14:26:36 UTC',
  1766. updated_at: '2016-11-07 14:26:36 UTC',
  1767. )
  1768. Scheduler.worker(true)
  1769. ticket = Ticket.find(ticket.id)
  1770. assert_equal(ticket.escalation_at.gmtime.to_s, '2016-11-09 10:26:36 UTC', 'ticket.escalation_at verify 1')
  1771. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2016-11-02 09:00:00 UTC', 'ticket.first_response_escalation_at verify 1')
  1772. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2016-11-09 10:26:36 UTC', 'ticket.update_escalation_at verify 1')
  1773. assert_nil(ticket.close_escalation_at, 'ticket.close_escalation_at verify 1')
  1774. delete = sla.destroy!
  1775. assert(delete, 'sla destroy')
  1776. delete = ticket.destroy!
  1777. assert(delete, 'ticket destroy')
  1778. calendar.destroy!
  1779. end
  1780. test 'ticket sla + observer check' do
  1781. ticket = Ticket.create!(
  1782. title: 'some title observer#1',
  1783. group: Group.lookup(name: 'Users'),
  1784. customer_id: 2,
  1785. state: Ticket::State.lookup(name: 'new'),
  1786. priority: Ticket::Priority.lookup(name: '2 normal'),
  1787. created_at: '2016-11-01 13:56:21 UTC',
  1788. updated_at: '2016-11-01 13:56:21 UTC',
  1789. updated_by_id: 1,
  1790. created_by_id: 1,
  1791. )
  1792. assert(ticket, 'ticket created')
  1793. assert_nil(ticket.escalation_at, 'ticket.escalation_at verify')
  1794. article_customer = Ticket::Article.create!(
  1795. ticket_id: ticket.id,
  1796. from: 'some_sender@example.com',
  1797. to: 'some_recipient@example.com',
  1798. subject: 'some subject',
  1799. message_id: 'some@id',
  1800. body: 'some message',
  1801. internal: false,
  1802. sender: Ticket::Article::Sender.where(name: 'Customer').first,
  1803. type: Ticket::Article::Type.where(name: 'web').first,
  1804. updated_by_id: 1,
  1805. created_by_id: 1,
  1806. created_at: '2016-11-01 13:56:21 UTC',
  1807. updated_at: '2016-11-01 13:56:21 UTC',
  1808. )
  1809. # set sla's for timezone "Europe/Berlin" wintertime (+1), so UTC times are 7:00-18:00
  1810. calendar = Calendar.create_or_update(
  1811. name: 'EU',
  1812. timezone: 'Europe/Berlin',
  1813. business_hours: {
  1814. mon: {
  1815. active: true,
  1816. timeframes: [ ['08:00', '20:00'] ]
  1817. },
  1818. tue: {
  1819. active: true,
  1820. timeframes: [ ['08:00', '20:00'] ]
  1821. },
  1822. wed: {
  1823. active: true,
  1824. timeframes: [ ['08:00', '20:00'] ]
  1825. },
  1826. thu: {
  1827. active: true,
  1828. timeframes: [ ['08:00', '20:00'] ]
  1829. },
  1830. fri: {
  1831. active: true,
  1832. timeframes: [ ['08:00', '20:00'] ]
  1833. },
  1834. sat: {
  1835. active: false,
  1836. timeframes: [ ['08:00', '17:00'] ]
  1837. },
  1838. sun: {
  1839. active: false,
  1840. timeframes: [ ['08:00', '17:00'] ]
  1841. },
  1842. },
  1843. public_holidays: {
  1844. '2016-11-01' => {
  1845. 'active' => true,
  1846. 'summary' => 'test 1',
  1847. },
  1848. },
  1849. default: true,
  1850. ical_url: nil,
  1851. updated_by_id: 1,
  1852. created_by_id: 1,
  1853. )
  1854. sla = Sla.create_or_update(
  1855. name: 'test sla 1',
  1856. condition: {},
  1857. calendar_id: calendar.id,
  1858. first_response_time: 60,
  1859. update_time: 120,
  1860. solution_time: nil,
  1861. updated_by_id: 1,
  1862. created_by_id: 1,
  1863. )
  1864. Scheduler.worker(true)
  1865. ticket = Ticket.find(ticket.id)
  1866. assert_equal(ticket.escalation_at.gmtime.to_s, '2016-11-02 08:00:00 UTC', 'ticket.escalation_at verify 1')
  1867. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2016-11-02 08:00:00 UTC', 'ticket.first_response_escalation_at verify 1')
  1868. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2016-11-02 09:00:00 UTC', 'ticket.update_escalation_at verify 1')
  1869. assert_nil(ticket.close_escalation_at, 'ticket.close_escalation_at verify 1')
  1870. article_agent = Ticket::Article.create!(
  1871. ticket_id: ticket.id,
  1872. from: 'some_sender@example.com',
  1873. to: 'some_recipient@example.com',
  1874. subject: 'some subject',
  1875. message_id: 'some@id',
  1876. body: 'some message',
  1877. internal: false,
  1878. sender: Ticket::Article::Sender.where(name: 'Agent').first,
  1879. type: Ticket::Article::Type.where(name: 'email').first,
  1880. updated_by_id: 1,
  1881. created_by_id: 1,
  1882. created_at: '2016-11-07 13:26:36 UTC',
  1883. updated_at: '2016-11-07 13:26:36 UTC',
  1884. )
  1885. Scheduler.worker(true)
  1886. ticket = Ticket.find(ticket.id)
  1887. assert_equal(ticket.escalation_at.gmtime.to_s, '2016-11-07 15:26:36 UTC', 'ticket.escalation_at verify 1')
  1888. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2016-11-02 08:00:00 UTC', 'ticket.first_response_escalation_at verify 1')
  1889. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2016-11-07 15:26:36 UTC', 'ticket.update_escalation_at verify 1')
  1890. assert_nil(ticket.close_escalation_at, 'ticket.close_escalation_at verify 1')
  1891. # set sla's for timezone "Europe/Berlin" wintertime (+1), so UTC times are 3:00-18:00
  1892. calendar.update!(
  1893. business_hours: {
  1894. mon: {
  1895. active: true,
  1896. timeframes: [ ['04:00', '20:00'] ]
  1897. },
  1898. tue: {
  1899. active: true,
  1900. timeframes: [ ['04:00', '20:00'] ]
  1901. },
  1902. wed: {
  1903. active: true,
  1904. timeframes: [ ['04:00', '20:00'] ]
  1905. },
  1906. thu: {
  1907. active: true,
  1908. timeframes: [ ['04:00', '20:00'] ]
  1909. },
  1910. fri: {
  1911. active: true,
  1912. timeframes: [ ['04:00', '20:00'] ]
  1913. },
  1914. sat: {
  1915. active: false,
  1916. timeframes: [ ['04:00', '13:00'] ]
  1917. },
  1918. sun: {
  1919. active: false,
  1920. timeframes: [ ['04:00', '17:00'] ]
  1921. },
  1922. },
  1923. public_holidays: {
  1924. '2016-11-01' => {
  1925. 'active' => true,
  1926. 'summary' => 'test 1',
  1927. },
  1928. },
  1929. default: true,
  1930. ical_url: nil,
  1931. updated_by_id: 1,
  1932. created_by_id: 1,
  1933. )
  1934. Scheduler.worker(true)
  1935. ticket = Ticket.find(ticket.id)
  1936. assert_equal(ticket.escalation_at.gmtime.to_s, '2016-11-07 15:26:36 UTC', 'ticket.escalation_at verify 1')
  1937. assert_equal(ticket.first_response_escalation_at.gmtime.to_s, '2016-11-02 04:00:00 UTC', 'ticket.first_response_escalation_at verify 1')
  1938. assert_equal(ticket.update_escalation_at.gmtime.to_s, '2016-11-07 15:26:36 UTC', 'ticket.update_escalation_at verify 1')
  1939. assert_nil(ticket.close_escalation_at, 'ticket.close_escalation_at verify 1')
  1940. delete = sla.destroy!
  1941. assert(delete, 'sla destroy')
  1942. delete = ticket.destroy!
  1943. assert(delete, 'ticket destroy')
  1944. calendar.destroy!
  1945. end
  1946. test 'update last_customer_contact_at when the agent does not reply' do
  1947. Setting.set('ticket_last_contact_behaviour', 'based_on_customer_reaction')
  1948. ticket = Ticket.create!(
  1949. title: 'test #1 last_contact_customer_at',
  1950. group: Group.lookup(name: 'Users'),
  1951. customer_id: 2,
  1952. state: Ticket::State.lookup(name: 'new'),
  1953. priority: Ticket::Priority.lookup(name: '2 normal'),
  1954. created_at: '2018-05-01 13:56:21 UTC',
  1955. updated_at: '2018-05-01 13:56:21 UTC',
  1956. updated_by_id: 1,
  1957. created_by_id: 1,
  1958. )
  1959. assert(ticket, 'ticket created')
  1960. article1 = Ticket::Article.create!(
  1961. ticket_id: ticket.id,
  1962. from: 'some_sender@example.com',
  1963. subject: 'some subject',
  1964. message_id: 'some@id',
  1965. body: 'some message',
  1966. internal: false,
  1967. sender: Ticket::Article::Sender.where(name: 'Customer').first,
  1968. type: Ticket::Article::Type.where(name: 'phone').first,
  1969. updated_by_id: 1,
  1970. created_by_id: 1,
  1971. created_at: '2018-05-01 13:56:21 UTC',
  1972. updated_at: '2018-05-01 13:56:21 UTC',
  1973. )
  1974. ticket.reload
  1975. assert_equal(ticket.article_count, 1)
  1976. assert_equal(ticket.last_contact_at.to_s, article1.created_at.to_s)
  1977. assert_equal(ticket.last_contact_customer_at.to_s, article1.created_at.to_s)
  1978. assert_nil(ticket.last_contact_agent_at)
  1979. assert_nil(ticket.first_response_at)
  1980. assert_nil(ticket.close_at)
  1981. article2 = Ticket::Article.create!(
  1982. ticket_id: ticket.id,
  1983. from: 'some_sender@example.com',
  1984. subject: 'some subject',
  1985. message_id: 'some@id',
  1986. body: 'some message',
  1987. internal: false,
  1988. sender: Ticket::Article::Sender.where(name: 'Customer').first,
  1989. type: Ticket::Article::Type.where(name: 'phone').first,
  1990. updated_by_id: 1,
  1991. created_by_id: 1,
  1992. created_at: '2018-05-01 14:56:21 UTC',
  1993. updated_at: '2018-05-01 14:56:21 UTC',
  1994. )
  1995. ticket = Ticket.find(ticket.id)
  1996. assert_equal(ticket.article_count, 2)
  1997. assert_equal(ticket.last_contact_at.to_s, article2.created_at.to_s)
  1998. assert_equal(ticket.last_contact_customer_at.to_s, article2.created_at.to_s)
  1999. assert_nil(ticket.last_contact_agent_at)
  2000. assert_nil(ticket.first_response_at)
  2001. assert_nil(ticket.close_at)
  2002. article3 = Ticket::Article.create!(
  2003. ticket_id: ticket.id,
  2004. from: 'some_sender@example.com',
  2005. subject: 'some subject',
  2006. message_id: 'some@id',
  2007. body: 'some message',
  2008. internal: false,
  2009. sender: Ticket::Article::Sender.where(name: 'Customer').first,
  2010. type: Ticket::Article::Type.where(name: 'phone').first,
  2011. updated_by_id: 1,
  2012. created_by_id: 1,
  2013. created_at: '2018-05-01 15:56:21 UTC',
  2014. updated_at: '2018-05-01 15:56:21 UTC',
  2015. )
  2016. ticket.reload
  2017. assert_equal(ticket.article_count, 3)
  2018. assert_equal(ticket.last_contact_at.to_s, article3.created_at.to_s)
  2019. assert_equal(ticket.last_contact_customer_at.to_s, article3.created_at.to_s)
  2020. assert_nil(ticket.last_contact_agent_at)
  2021. assert_nil(ticket.first_response_at)
  2022. assert_nil(ticket.close_at)
  2023. article4 = Ticket::Article.create!(
  2024. ticket_id: ticket.id,
  2025. from: 'some_sender@example.com',
  2026. subject: 'some subject',
  2027. message_id: 'some@id',
  2028. body: 'some message',
  2029. internal: false,
  2030. sender: Ticket::Article::Sender.where(name: 'Agent').first,
  2031. type: Ticket::Article::Type.where(name: 'phone').first,
  2032. updated_by_id: 1,
  2033. created_by_id: 1,
  2034. created_at: '2018-05-01 16:56:21 UTC',
  2035. updated_at: '2018-05-01 16:56:21 UTC',
  2036. )
  2037. ticket.reload
  2038. assert_equal(ticket.article_count, 4)
  2039. assert_equal(ticket.last_contact_at.to_s, article4.created_at.to_s)
  2040. assert_equal(ticket.last_contact_customer_at.to_s, article3.created_at.to_s)
  2041. assert_equal(ticket.last_contact_agent_at.to_s, article4.created_at.to_s)
  2042. assert_equal(ticket.first_response_at.to_s, article4.created_at.to_s)
  2043. assert_nil(ticket.close_at)
  2044. end
  2045. end