fill_db.rb 11 KB

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