fill_db.rb 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369
  1. # Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. # rubocop:disable Rails/Output
  3. module FillDb
  4. =begin
  5. fill your database with demo records
  6. FillDb.load(
  7. agents: 50,
  8. customers: 1000,
  9. groups: 20,
  10. organizations: 40,
  11. overviews: 5,
  12. tickets: 100,
  13. knowledge_base_answers: 100,
  14. knowledge_base_categories: 20,
  15. )
  16. or if you only want to create 100 tickets
  17. FillDb.load(tickets: 100)
  18. FillDb.load(agents: 20)
  19. FillDb.load(overviews: 20)
  20. FillDb.load(tickets: 10000)
  21. FillDb.load(knowledge_base_answers: 100)
  22. FillDb.load(knowledge_base_categories: 20)
  23. =end
  24. def self.load(params)
  25. nice = params[:nice] || 0.5
  26. agents = params[:agents] || 0
  27. customers = params[:customers] || 0
  28. groups = params[:groups] || 0
  29. organizations = params[:organizations] || 0
  30. overviews = params[:overviews] || 0
  31. tickets = params[:tickets] || 0
  32. knowledge_base_answers = params[:knowledge_base_answers] || 0
  33. knowledge_base_categories = params[:knowledge_base_categories] || 0
  34. puts 'load db with:'
  35. puts " agents: #{agents}"
  36. puts " customers: #{customers}"
  37. puts " groups: #{groups}"
  38. puts " organizations: #{organizations}"
  39. puts " overviews: #{overviews}"
  40. puts " tickets: #{tickets}"
  41. puts " knowledge_base_answers: #{knowledge_base_answers}"
  42. puts " knowledge_base_categories: #{knowledge_base_categories}"
  43. # set current user
  44. UserInfo.current_user_id = 1
  45. # organizations
  46. organization_pool = []
  47. if organizations.zero?
  48. organization_pool = Organization.where(active: true)
  49. puts " take #{organization_pool.length} organizations"
  50. else
  51. (1..organizations).each do
  52. ActiveRecord::Base.transaction do
  53. organization = Organization.create!(name: "FillOrganization::#{counter}", active: true)
  54. organization_pool.push organization
  55. end
  56. end
  57. end
  58. # create agents
  59. agent_pool = []
  60. if agents.zero?
  61. agent_pool = Role.where(name: 'Agent').first.users.where(active: true)
  62. puts " take #{agent_pool.length} agents"
  63. else
  64. roles = Role.where(name: [ 'Agent'])
  65. groups_all = Group.all
  66. (1..agents).each do
  67. ActiveRecord::Base.transaction do
  68. suffix = counter.to_s
  69. user = User.create_or_update(
  70. login: "filldb-agent-#{suffix}",
  71. firstname: "agent #{suffix}",
  72. lastname: "agent #{suffix}",
  73. email: "filldb-agent-#{suffix}@example.com",
  74. password: 'agentpw',
  75. active: true,
  76. roles: roles,
  77. groups: groups_all,
  78. )
  79. sleep nice
  80. agent_pool.push user
  81. end
  82. end
  83. end
  84. # create customer
  85. customer_pool = []
  86. if customers.zero?
  87. customer_pool = Role.where(name: 'Customer').first.users.where(active: true)
  88. puts " take #{customer_pool.length} customers"
  89. else
  90. roles = Role.where(name: [ 'Customer'])
  91. groups_all = Group.all
  92. true_or_false = [true, false]
  93. (1..customers).each do
  94. ActiveRecord::Base.transaction do
  95. suffix = counter.to_s
  96. organization = nil
  97. if organization_pool.present? && true_or_false.sample
  98. organization = organization_pool.sample
  99. end
  100. user = User.create_or_update(
  101. login: "filldb-customer-#{suffix}",
  102. firstname: "customer #{suffix}",
  103. lastname: "customer #{suffix}",
  104. email: "filldb-customer-#{suffix}@example.com",
  105. password: 'customerpw',
  106. active: true,
  107. organization: organization,
  108. roles: roles,
  109. )
  110. sleep nice
  111. customer_pool.push user
  112. end
  113. end
  114. end
  115. # create groups
  116. group_pool = []
  117. if groups.zero?
  118. group_pool = Group.where(active: true)
  119. puts " take #{group_pool.length} groups"
  120. else
  121. (1..groups).each do
  122. ActiveRecord::Base.transaction do
  123. group = Group.create!(name: "FillGroup::#{counter}", active: true)
  124. group_pool.push group
  125. Role.where(name: 'Agent').first.users.where(active: true).each do |user|
  126. user_groups = user.groups
  127. user_groups.push group
  128. user.groups = user_groups
  129. user.save!
  130. end
  131. sleep nice
  132. end
  133. end
  134. end
  135. # create overviews
  136. if !overviews.zero?
  137. (1..overviews).each do
  138. ActiveRecord::Base.transaction do
  139. Overview.create!(
  140. name: "Filloverview::#{counter}",
  141. role_ids: [Role.find_by(name: 'Agent').id],
  142. condition: {
  143. 'ticket.state_id' => {
  144. operator: 'is',
  145. value: Ticket::State.by_category(:work_on_all).pluck(:id),
  146. },
  147. },
  148. order: {
  149. by: 'created_at',
  150. direction: 'ASC',
  151. },
  152. view: {
  153. d: %w[title customer group state owner created_at],
  154. s: %w[title customer group state owner created_at],
  155. m: %w[number title customer group state owner created_at],
  156. view_mode_default: 's',
  157. },
  158. active: true
  159. )
  160. end
  161. end
  162. end
  163. # create tickets
  164. if tickets.positive?
  165. priority_pool = Ticket::Priority.all
  166. state_pool = Ticket::State.all
  167. tickets.times do
  168. ActiveRecord::Base.transaction do
  169. customer = customer_pool.sample
  170. agent = agent_pool.sample
  171. ticket = Ticket.create!(
  172. title: "some title äöüß#{counter}",
  173. group: group_pool.sample,
  174. customer: customer,
  175. owner: agent,
  176. state: state_pool.sample,
  177. priority: priority_pool.sample,
  178. updated_by_id: agent.id,
  179. created_by_id: agent.id,
  180. )
  181. # create article
  182. Ticket::Article.create!(
  183. ticket_id: ticket.id,
  184. from: customer.email,
  185. to: 'some_recipient@example.com',
  186. subject: "some subject#{counter}",
  187. message_id: "some@id-#{counter}",
  188. body: 'some message ...',
  189. internal: false,
  190. sender: Ticket::Article::Sender.where(name: 'Customer').first,
  191. type: Ticket::Article::Type.where(name: 'phone').first,
  192. updated_by_id: agent.id,
  193. created_by_id: agent.id,
  194. )
  195. puts " Ticket #{ticket.number} created"
  196. sleep nice
  197. end
  198. end
  199. end
  200. knowledge_base = nil
  201. knowledge_base_categories_created = nil
  202. if knowledge_base_categories.positive?
  203. ActiveRecord::Base.transaction do
  204. knowledge_base = create_knowledge_base
  205. knowledge_base_categories_created = create_knowledge_base_categories(
  206. amount: knowledge_base_categories,
  207. knowledge_base_id: knowledge_base.id,
  208. locale_id: knowledge_base.kb_locales.first.id,
  209. sleep_time: nice,
  210. )
  211. end
  212. end
  213. return if knowledge_base_answers.zero?
  214. ActiveRecord::Base.transaction do
  215. create_knowledge_base_answers(
  216. amount: knowledge_base_answers,
  217. categories_amount: knowledge_base_categories,
  218. categories: knowledge_base_categories_created,
  219. knowledge_base: knowledge_base,
  220. agents: agent_pool,
  221. sleep_time: nice,
  222. )
  223. end
  224. end
  225. def self.counter
  226. @counter ||= SecureRandom.random_number(1_000_000)
  227. @counter += 1
  228. end
  229. def self.create_knowledge_base
  230. return KnowledgeBase.first if KnowledgeBase.count.positive?
  231. params = {
  232. iconset: 'FontAwesome',
  233. color_highlight: '#38ae6a',
  234. color_header: '#f9fafb',
  235. color_header_link: 'hsl(206,8%,50%)',
  236. homepage_layout: 'grid',
  237. category_layout: 'grid',
  238. active: true,
  239. kb_locales_attributes: [
  240. {
  241. system_locale_id: Locale.first.id,
  242. primary: true,
  243. },
  244. ],
  245. }
  246. clean_params = KnowledgeBase.association_name_to_id_convert(params)
  247. clean_params = KnowledgeBase.param_cleanup(clean_params, true)
  248. knowledge_base = KnowledgeBase.new(clean_params)
  249. knowledge_base.associations_from_param(params)
  250. knowledge_base.save!
  251. puts " KnowledgeBase #{knowledge_base.id} created"
  252. knowledge_base
  253. end
  254. def self.create_knowledge_base_categories(params)
  255. amount = params[:amount]
  256. knowledge_base_id = params[:knowledge_base_id]
  257. locale_id = params[:locale_id]
  258. sleep_time = params[:sleep_time]
  259. category_icons = %w[f1eb f143 f17c f109 f011 f275 f26c f0eb f2a3 f299 f0d0 f14e f26b f249 f108 f17a f09b f2a0 f20e f233]
  260. category_pool = []
  261. amount.times do |index|
  262. category = KnowledgeBase::Category.create!(
  263. knowledge_base_id: knowledge_base_id,
  264. category_icon: category_icons.sample,
  265. position: index
  266. )
  267. puts " KnowledgeBase::Category #{category.id} created"
  268. category_pool.push category
  269. category_translation = KnowledgeBase::Category::Translation.create!(
  270. title: "some title#{counter}",
  271. kb_locale_id: locale_id,
  272. category_id: category.id,
  273. )
  274. puts " KnowledgeBase::Category::Translation #{category_translation.title} created"
  275. sleep sleep_time
  276. end
  277. category_pool
  278. end
  279. def self.create_knowledge_base_answers(params)
  280. answers_amount = params[:amount]
  281. categories_amount = params[:categories_amount]
  282. categories = params[:categories]
  283. knowledge_base = params[:knowledge_base]
  284. agents = params[:agents]
  285. sleep_time = params[:sleep_time]
  286. if knowledge_base.blank?
  287. knowledge_base = create_knowledge_base
  288. end
  289. locale = knowledge_base.kb_locales.first
  290. category_pool = categories.presence || create_knowledge_base_categories(categories_amount, knowledge_base.id, locale.id, sleep_time)
  291. if category_pool.blank?
  292. puts " Found #{category_pool.count} categories, aborting!"
  293. return
  294. end
  295. answers_amount.times do |index|
  296. answer = KnowledgeBase::Answer.create!(
  297. category_id: category_pool.sample.id,
  298. promoted: false,
  299. position: index,
  300. )
  301. content = KnowledgeBase::Answer::Translation::Content.create!(
  302. body: '<div style="color:rgb(63, 63, 63);">
  303. <p>some content...</p>
  304. </div>'
  305. )
  306. agent = agents.sample
  307. KnowledgeBase::Answer::Translation.create!(
  308. title: "some title#{counter}",
  309. kb_locale_id: locale.id,
  310. answer_id: answer.id,
  311. content_id: content.id,
  312. created_by_id: agent.id,
  313. updated_by_id: agent.id,
  314. )
  315. puts " KnowledgeBase::Answer #{answer.id} created"
  316. sleep sleep_time
  317. end
  318. end
  319. end
  320. # rubocop:enable Rails/Output