rails_crm 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (316) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -23
  3. data/app/controllers/crm/admin/addresses_controller.rb +57 -0
  4. data/app/controllers/crm/admin/agencies_controller.rb +65 -0
  5. data/app/controllers/crm/admin/card_purchases_controller.rb +16 -0
  6. data/app/controllers/crm/admin/card_templates_controller.rb +49 -0
  7. data/app/controllers/crm/admin/home_controller.rb +8 -0
  8. data/app/controllers/crm/admin/maintain_logs_controller.rb +2 -20
  9. data/app/controllers/crm/admin/maintain_sources_controller.rb +2 -20
  10. data/app/controllers/crm/admin/maintain_tags_controller.rb +3 -21
  11. data/app/controllers/crm/admin/maintains_controller.rb +53 -94
  12. data/app/controllers/crm/admin/orders_controller.rb +70 -0
  13. data/app/controllers/crm/admin/payments_controller.rb +11 -0
  14. data/app/controllers/crm/admin/wallet_logs_controller.rb +25 -0
  15. data/app/controllers/crm/admin/wallet_payments_controller.rb +41 -0
  16. data/app/controllers/crm/admin/wallet_templates_controller.rb +44 -0
  17. data/app/controllers/crm/admin/wallets_controller.rb +41 -0
  18. data/app/controllers/crm/controller/me.rb +16 -0
  19. data/app/controllers/crm/me/agencies_controller.rb +69 -0
  20. data/app/controllers/crm/me/base_controller.rb +4 -0
  21. data/app/controllers/crm/me/home_controller.rb +12 -0
  22. data/app/controllers/crm/me/maintain_sources_controller.rb +38 -0
  23. data/app/controllers/crm/me/maintains_controller.rb +5 -0
  24. data/app/controllers/crm/my/agencies_controller.rb +53 -0
  25. data/app/controllers/crm/panel/base_controller.rb +5 -0
  26. data/app/controllers/crm/panel/home_controller.rb +8 -0
  27. data/app/controllers/crm/panel/qrcodes_controller.rb +29 -0
  28. data/app/controllers/crm/panel/sources_controller.rb +23 -0
  29. data/app/controllers/crm/panel/tags_controller.rb +26 -0
  30. data/app/controllers/crm/panel/texts_controller.rb +29 -0
  31. data/app/imports/crm/maintain_import.rb +11 -0
  32. data/app/jobs/crm/order_maintain_sync_job.rb +9 -0
  33. data/app/models/crm/agency.rb +5 -0
  34. data/app/models/crm/ext/address.rb +10 -0
  35. data/app/models/crm/ext/agency.rb +18 -0
  36. data/app/models/crm/ext/agent.rb +13 -0
  37. data/app/models/crm/ext/client.rb +13 -0
  38. data/app/models/crm/ext/maintainable.rb +24 -0
  39. data/app/models/crm/ext/member.rb +11 -0
  40. data/app/models/crm/{model → ext}/organ.rb +3 -3
  41. data/app/models/crm/maintain.rb +1 -1
  42. data/app/models/crm/model/agency.rb +11 -6
  43. data/app/models/crm/model/maintain.rb +54 -22
  44. data/app/models/crm/model/maintain_log.rb +2 -1
  45. data/app/models/crm/model/maintain_source.rb +5 -3
  46. data/app/models/crm/model/maintain_tag.rb +6 -5
  47. data/app/models/crm/model/qrcode.rb +54 -0
  48. data/app/models/crm/model/source.rb +55 -0
  49. data/app/models/crm/model/source_contact.rb +40 -0
  50. data/app/models/crm/model/{maintain_tag_template.rb → tag.rb} +1 -1
  51. data/app/models/crm/model/text.rb +45 -0
  52. data/app/models/crm/qrcode.rb +5 -0
  53. data/app/models/crm/source.rb +18 -0
  54. data/app/models/crm/source_contact.rb +5 -0
  55. data/app/models/crm/tag.rb +5 -0
  56. data/app/models/crm/text.rb +5 -0
  57. data/app/views/admin/_crm_nav.html.erb +9 -9
  58. data/app/views/crm/admin/addresses/_index/_breadcrumb.html.erb +6 -0
  59. data/app/views/crm/admin/addresses/_index/_top_bar.html+phone.erb +9 -0
  60. data/app/views/crm/admin/addresses/_nav.html.erb +4 -0
  61. data/app/views/crm/admin/addresses/_new/_top_bar.html.erb +12 -0
  62. data/app/views/crm/admin/addresses/_order/_weui_dialog_ft.html.erb +4 -0
  63. data/app/views/crm/admin/addresses/_order_from/_weui_dialog_ft.html.erb +4 -0
  64. data/app/views/crm/admin/addresses/index.html+phone.erb +7 -0
  65. data/app/views/crm/admin/agencies/_filter_form.html.erb +9 -0
  66. data/app/views/crm/admin/agencies/_form.html.erb +5 -0
  67. data/app/views/crm/admin/agencies/_index/_index_tbody.html.erb +38 -0
  68. data/app/views/crm/admin/agencies/_index/_index_thead.html.erb +7 -0
  69. data/app/views/crm/admin/agencies/_show_table.html.erb +33 -0
  70. data/app/views/crm/admin/agencies/edit_crowd.html.erb +6 -0
  71. data/app/views/crm/admin/base/_nav.html.erb +4 -0
  72. data/app/views/crm/admin/card_purchases/_index/_top_bar.html+phone.erb +12 -0
  73. data/app/views/crm/admin/card_templates/_index/_index_table.html+phone.erb +8 -0
  74. data/app/views/crm/admin/card_templates/_index/_index_tbody.html+phone.erb +6 -0
  75. data/app/views/crm/admin/card_templates/_index/_index_tr.html+phone.erb +6 -0
  76. data/app/views/crm/admin/card_templates/_index/_top_bar.html+phone.erb +11 -0
  77. data/app/views/crm/admin/card_templates/_show/_top_bar.html+phone.erb +12 -0
  78. data/app/views/crm/admin/home/index.html.erb +0 -0
  79. data/app/views/crm/admin/maintain_logs/_filter_form.html.erb +1 -1
  80. data/app/views/crm/admin/maintain_logs/_form.html.erb +2 -6
  81. data/app/views/crm/admin/maintain_logs/{_breadcrumb.html.erb → _index/_breadcrumb.html.erb} +1 -1
  82. data/app/views/crm/admin/maintain_logs/{_index_tbody.html.erb → _index/_index_tbody.html.erb} +1 -1
  83. data/app/views/crm/admin/maintain_logs/_index/_index_thead.html.erb +13 -0
  84. data/app/views/crm/admin/maintain_logs/_show_table.html.erb +5 -5
  85. data/app/views/crm/admin/maintain_sources/_filter_form.html.erb +1 -1
  86. data/app/views/crm/admin/maintain_sources/_form.html.erb +0 -1
  87. data/app/views/crm/admin/maintain_sources/_index/_index_tbody.html.erb +2 -0
  88. data/app/views/crm/admin/maintain_sources/_index/_index_thead.html.erb +2 -0
  89. data/app/views/crm/admin/maintain_sources/_index/_index_tr.html.erb +13 -0
  90. data/app/views/crm/admin/maintain_sources/templates.html.erb +0 -1
  91. data/app/views/crm/admin/maintain_tags/_form.html.erb +1 -2
  92. data/app/views/crm/admin/maintain_tags/{_index_tbody.html.erb → _index/_index_tbody.html.erb} +3 -1
  93. data/app/views/crm/admin/maintain_tags/_index/_index_thead.html.erb +5 -0
  94. data/app/views/crm/admin/maintain_tags/_show_table.html.erb +6 -6
  95. data/app/views/crm/admin/maintain_tags/templates.html.erb +6 -6
  96. data/app/views/crm/admin/maintains/_actions.html.erb +36 -0
  97. data/app/views/crm/admin/maintains/_agent_form.html.erb +14 -0
  98. data/app/views/crm/admin/maintains/_base/_agent_detect.html.erb +16 -0
  99. data/app/views/crm/admin/maintains/_base/_agent_show_table.html.erb +30 -0
  100. data/app/views/crm/admin/maintains/_base/_agent_tbody.html.erb +5 -0
  101. data/app/views/crm/admin/maintains/_base/_agent_thead.html.erb +5 -0
  102. data/app/views/crm/admin/maintains/_base/_filter_table.html+phone.erb +0 -0
  103. data/app/views/crm/admin/maintains/_base/_filter_table.html.erb +35 -0
  104. data/app/views/crm/admin/maintains/_base/_tabs.html.erb +7 -0
  105. data/app/views/crm/admin/maintains/_client_form.html+phone.erb +15 -0
  106. data/app/views/crm/admin/maintains/_client_form.html.erb +11 -0
  107. data/app/views/crm/admin/maintains/_create_detect.html.erb +9 -21
  108. data/app/views/crm/admin/maintains/_edit_assign.html.erb +10 -19
  109. data/app/views/crm/admin/maintains/_edit_form.html.erb +4 -2
  110. data/app/views/crm/admin/maintains/_edit_transfer.html.erb +8 -17
  111. data/app/views/crm/admin/maintains/_form.html.erb +15 -33
  112. data/app/views/crm/admin/maintains/_index/_button.html+phone.erb +4 -0
  113. data/app/views/crm/admin/maintains/_index/_button.html.erb +4 -0
  114. data/app/views/crm/admin/maintains/_index/_filter_form.html+phone.erb +14 -0
  115. data/app/views/crm/admin/maintains/{_filter_form.html.erb → _index/_filter_form.html.erb} +5 -5
  116. data/app/views/crm/admin/maintains/_index/_index_tbody.html+phone.erb +9 -0
  117. data/app/views/crm/admin/maintains/_index/_index_tbody.html.erb +49 -0
  118. data/app/views/crm/admin/maintains/_index/_index_thead.html.erb +42 -0
  119. data/app/views/crm/admin/maintains/_index/_index_tr.html+phone.erb +10 -0
  120. data/app/views/crm/admin/maintains/_index/_index_tr.html.erb +30 -0
  121. data/app/views/crm/admin/maintains/_new_batch_assign.html.erb +4 -13
  122. data/app/views/crm/admin/maintains/_new_detect/_new_detect.html+phone.erb +10 -0
  123. data/app/views/crm/admin/maintains/_new_detect/_new_detect.html.erb +4 -0
  124. data/app/views/crm/admin/maintains/_new_form.html+phone.erb +4 -0
  125. data/app/views/crm/admin/maintains/_new_form.html.erb +4 -2
  126. data/app/views/crm/admin/maintains/_public/_filter_form.html.erb +10 -0
  127. data/app/views/crm/admin/maintains/_public/_index_tbody.html.erb +33 -0
  128. data/app/views/crm/admin/maintains/_public/_index_thead.html.erb +33 -0
  129. data/app/views/crm/admin/maintains/_public/_index_tr.html.erb +24 -0
  130. data/app/views/crm/admin/maintains/_show/_external.html.erb +19 -0
  131. data/app/views/crm/admin/maintains/_show/_profile.html.erb +24 -0
  132. data/app/views/crm/admin/maintains/_show/_show_head.html+phone.erb +16 -0
  133. data/app/views/crm/admin/maintains/_show_table.html.erb +4 -49
  134. data/app/views/crm/admin/maintains/assume.turbo_stream.erb +3 -0
  135. data/app/views/crm/admin/maintains/create_detect.html.erb +3 -0
  136. data/app/views/crm/admin/maintains/detach.turbo_stream.erb +3 -0
  137. data/app/views/crm/admin/maintains/edit_assign.html.erb +3 -0
  138. data/app/views/crm/admin/maintains/edit_transfer.html.erb +3 -0
  139. data/app/views/crm/admin/maintains/index.html+phone.erb +8 -0
  140. data/app/views/crm/admin/maintains/index.html.erb +9 -26
  141. data/app/views/crm/admin/maintains/new_batch_assign.html.erb +3 -0
  142. data/app/views/crm/admin/maintains/new_detect.html.erb +7 -0
  143. data/app/views/crm/admin/maintains/public.html.erb +6 -80
  144. data/app/views/crm/admin/orders/_actions.html+phone.erb +16 -0
  145. data/app/views/crm/admin/orders/_add/_top_bar.html.erb +18 -0
  146. data/app/views/crm/admin/orders/_base/_address.html+phone.erb +25 -0
  147. data/app/views/crm/admin/orders/_base/_from_address.html+phone.erb +25 -0
  148. data/app/views/crm/admin/{maintains/_edit_order.html.erb → orders/_edit_form.html.erb} +1 -1
  149. data/app/views/crm/admin/orders/_index/_breadcrumb.html.erb +6 -0
  150. data/app/views/crm/admin/orders/_index/_button.html+phone.erb +4 -0
  151. data/app/views/crm/admin/orders/_index/_button.html.erb +4 -0
  152. data/app/views/crm/admin/orders/_index/_index_tbody.html+phone.erb +10 -0
  153. data/app/views/crm/admin/orders/_index/_index_tr.html+phone.erb +10 -0
  154. data/app/views/crm/admin/orders/_index/_index_tr.html.erb +16 -0
  155. data/app/views/crm/admin/orders/_index/_top_bar.html+phone.erb +13 -0
  156. data/app/views/crm/admin/orders/_nav.html.erb +4 -0
  157. data/app/views/crm/admin/orders/_new/_address_button.html.erb +4 -0
  158. data/app/views/crm/admin/orders/_new/_breadcrumb.html.erb +7 -0
  159. data/app/views/crm/admin/orders/_new/_head.html.erb +3 -0
  160. data/app/views/crm/admin/orders/_new/_top_bar.html.erb +12 -0
  161. data/app/views/crm/admin/orders/index.html+phone.erb +7 -0
  162. data/app/views/crm/admin/orders/index.html.erb +7 -0
  163. data/app/views/crm/admin/orders/payment_types.html+phone.erb +19 -0
  164. data/app/views/crm/admin/orders/payment_types.html.erb +17 -0
  165. data/app/views/crm/admin/payments/create.turbo_stream+phone.erb +3 -0
  166. data/app/views/crm/admin/payments/destroy.turbo_stream+phone.erb +3 -0
  167. data/app/views/crm/admin/payments/order_create.turbo_stream+phone.erb +3 -0
  168. data/app/views/crm/admin/wallet_logs/_index/_top_bar.html+phone.erb +12 -0
  169. data/app/views/crm/admin/wallet_payments/_index/_top_bar.html+phone.erb +12 -0
  170. data/app/views/crm/admin/wallet_templates/_index/_breadcrumb.html.erb +12 -0
  171. data/app/views/crm/admin/wallet_templates/_index/_filter_form.html.erb +0 -0
  172. data/app/views/crm/admin/wallet_templates/_index/_index_table.html+phone.erb +8 -0
  173. data/app/views/crm/admin/wallet_templates/_index/_index_tbody.html+phone.erb +6 -0
  174. data/app/views/crm/admin/wallet_templates/_index/_index_tbody.html.erb +13 -0
  175. data/app/views/crm/admin/wallet_templates/_index/_index_thead.html.erb +2 -0
  176. data/app/views/crm/admin/wallet_templates/_index/_index_tr.html+phone.erb +6 -0
  177. data/app/views/crm/admin/wallet_templates/_index/_top_bar.html+phone.erb +11 -0
  178. data/app/views/crm/admin/wallet_templates/_show/_top_bar.html+phone.erb +12 -0
  179. data/app/views/crm/admin/{maintain_sources → wallets/_index}/_breadcrumb.html.erb +2 -1
  180. data/app/views/crm/admin/wallets/_index/_index_table.html.erb +12 -0
  181. data/app/views/crm/admin/wallets/_index/_index_tbody.html.erb +25 -0
  182. data/app/views/crm/admin/wallets/_index/_index_thead.html.erb +5 -0
  183. data/app/views/crm/admin/wallets/_index/_index_tr.html.erb +19 -0
  184. data/app/views/crm/admin/wallets/_index/_tab_bar_footer.html.erb +4 -0
  185. data/app/views/crm/admin/wallets/_index/_template_tbody.html.erb +12 -0
  186. data/app/views/crm/admin/wallets/_index/_template_tr.html.erb +10 -0
  187. data/app/views/crm/admin/wallets/_index/_top_bar.html+phone.erb +11 -0
  188. data/app/views/crm/admin/wallets/_index/_wallet.html.erb +21 -0
  189. data/app/views/crm/admin/wallets/index.html+phone.erb +3 -0
  190. data/app/views/crm/admin/wallets/index.html.erb +6 -0
  191. data/app/views/crm/me/agencies/_client_form.html.erb +9 -0
  192. data/app/views/crm/me/agencies/_filter.html.erb +8 -0
  193. data/app/views/crm/me/agencies/_form.html.erb +7 -0
  194. data/app/views/crm/me/agencies/_show_table.html.erb +36 -0
  195. data/app/views/crm/me/agencies/index.html+phone.erb +18 -0
  196. data/app/views/crm/me/agencies/index.html.erb +40 -0
  197. data/app/views/crm/me/home/_cart_item.html.erb +15 -0
  198. data/app/views/crm/me/home/index.html+phone.erb +38 -0
  199. data/app/views/crm/me/maintain_sources/_about_item.html.erb +33 -0
  200. data/app/views/crm/me/maintain_sources/_order.html.erb +11 -0
  201. data/app/views/crm/me/maintain_sources/index.html.erb +20 -0
  202. data/app/views/crm/me/maintain_sources/list.html.erb +13 -0
  203. data/app/views/crm/me/maintain_sources/source.html.erb +33 -0
  204. data/app/views/crm/my/agencies/_client_form.html.erb +9 -0
  205. data/app/views/crm/my/agencies/_edit_form.html.erb +4 -0
  206. data/app/views/crm/{admin/maintain_source_templates → my/agencies}/_filter_form.html.erb +1 -1
  207. data/app/views/crm/my/agencies/_form.html.erb +19 -0
  208. data/app/views/crm/my/agencies/_new_form.html.erb +4 -0
  209. data/app/views/crm/my/agencies/_show_table.html.erb +36 -0
  210. data/app/views/crm/my/agencies/index.html+phone.erb +24 -0
  211. data/app/views/crm/my/agencies/index.html.erb +40 -0
  212. data/app/views/crm/panel/base/_nav.html.erb +4 -0
  213. data/app/views/crm/panel/home/index.html.erb +0 -0
  214. data/app/views/crm/panel/qrcodes/_form.html.erb +5 -0
  215. data/app/views/crm/panel/qrcodes/_index/_breadcrumb.html.erb +7 -0
  216. data/app/views/crm/panel/qrcodes/_index/_index_tbody.html.erb +13 -0
  217. data/app/views/crm/panel/qrcodes/_index/_index_thead.html.erb +11 -0
  218. data/app/views/crm/panel/qrcodes/_show_table.html.erb +4 -0
  219. data/app/views/crm/panel/qrcodes/index.html.erb +3 -0
  220. data/app/views/crm/panel/sources/_form.html.erb +4 -0
  221. data/app/views/crm/{admin/maintain_tag_templates → panel/sources/_index}/_filter_form.html.erb +1 -1
  222. data/app/views/crm/panel/sources/_index/_index_tbody.html.erb +13 -0
  223. data/app/views/crm/panel/sources/_index/_index_thead.html.erb +3 -0
  224. data/app/views/crm/panel/sources/_index/_index_tr.html.erb +25 -0
  225. data/app/views/crm/panel/sources/_show/_breadcrumb.html.erb +6 -0
  226. data/app/views/crm/panel/sources/_show/_qrcode_button.html.erb +4 -0
  227. data/app/views/crm/panel/sources/_show/_qrcode_table.html.erb +18 -0
  228. data/app/views/crm/panel/sources/_show/_qrcode_tbody.html.erb +13 -0
  229. data/app/views/crm/panel/sources/_show/_qrcode_thead.html.erb +11 -0
  230. data/app/views/crm/panel/sources/_show/_qrcode_tr.html.erb +16 -0
  231. data/app/views/crm/panel/sources/_show/_show_table.html.erb +16 -0
  232. data/app/views/crm/panel/sources/_show/_text_button.html.erb +4 -0
  233. data/app/views/crm/panel/sources/_show/_text_table.html.erb +18 -0
  234. data/app/views/crm/panel/sources/_show/_text_tbody.html.erb +9 -0
  235. data/app/views/crm/panel/sources/_show/_text_thead.html.erb +9 -0
  236. data/app/views/crm/panel/sources/_show/_text_tr.html.erb +16 -0
  237. data/app/views/crm/panel/sources/index.html.erb +8 -0
  238. data/app/views/crm/panel/sources/show.html.erb +14 -0
  239. data/app/views/crm/{admin/maintain_tag_templates → panel/tags}/_form.html.erb +0 -1
  240. data/app/views/crm/{admin/maintain_tag_templates → panel/tags/_index}/_index_tbody.html.erb +4 -2
  241. data/app/views/crm/panel/tags/_index/_index_thead.html.erb +8 -0
  242. data/app/views/crm/panel/tags/_show_table.html.erb +20 -0
  243. data/app/views/crm/panel/texts/_form.html.erb +5 -0
  244. data/app/views/crm/panel/texts/_index/_breadcrumb.html.erb +7 -0
  245. data/app/views/crm/panel/texts/_index/_index_tbody.html.erb +9 -0
  246. data/app/views/crm/panel/texts/_index/_index_thead.html.erb +9 -0
  247. data/app/views/crm/panel/texts/_show_table.html.erb +4 -0
  248. data/app/views/crm/panel/texts/index.html.erb +3 -0
  249. data/app/views/panel/_crm_nav.html.erb +11 -0
  250. data/config/locales/en.enum.yml +6 -0
  251. data/config/locales/zh.attributes.yml +16 -7
  252. data/config/locales/zh.controller.yml +82 -5
  253. data/config/locales/zh.enum.yml +40 -2
  254. data/config/routes.rb +88 -14
  255. data/lib/rails_crm/engine.rb +2 -6
  256. metadata +254 -80
  257. data/app/controllers/crm/admin/maintain_source_templates_controller.rb +0 -52
  258. data/app/controllers/crm/admin/maintain_tag_templates_controller.rb +0 -56
  259. data/app/models/crm/maintain_source_template.rb +0 -5
  260. data/app/models/crm/maintain_tag_template.rb +0 -5
  261. data/app/models/crm/model/maintain_source_template.rb +0 -12
  262. data/app/models/crm/model/member.rb +0 -11
  263. data/app/models/crm/model/order.rb +0 -10
  264. data/app/views/crm/admin/maintain_logs/_index_thead.html.erb +0 -14
  265. data/app/views/crm/admin/maintain_logs/_maintain_log.json.jbuilder +0 -11
  266. data/app/views/crm/admin/maintain_logs/_show.json.jbuilder +0 -1
  267. data/app/views/crm/admin/maintain_logs/index.json.jbuilder +0 -2
  268. data/app/views/crm/admin/maintain_source_templates/_edit_form.html.erb +0 -4
  269. data/app/views/crm/admin/maintain_source_templates/_form.html.erb +0 -2
  270. data/app/views/crm/admin/maintain_source_templates/_index_tbody.html.erb +0 -14
  271. data/app/views/crm/admin/maintain_source_templates/_index_thead.html.erb +0 -2
  272. data/app/views/crm/admin/maintain_source_templates/_maintain_source.json.jbuilder +0 -7
  273. data/app/views/crm/admin/maintain_source_templates/_new_form.html.erb +0 -4
  274. data/app/views/crm/admin/maintain_source_templates/_show.json.jbuilder +0 -1
  275. data/app/views/crm/admin/maintain_source_templates/_show_table.html.erb +0 -8
  276. data/app/views/crm/admin/maintain_source_templates/index.json.jbuilder +0 -1
  277. data/app/views/crm/admin/maintain_sources/_edit_form.html.erb +0 -4
  278. data/app/views/crm/admin/maintain_sources/_index_tbody.html.erb +0 -12
  279. data/app/views/crm/admin/maintain_sources/_index_thead.html.erb +0 -3
  280. data/app/views/crm/admin/maintain_sources/_maintain_source.json.jbuilder +0 -6
  281. data/app/views/crm/admin/maintain_sources/_show.json.jbuilder +0 -1
  282. data/app/views/crm/admin/maintain_sources/index.json.jbuilder +0 -1
  283. data/app/views/crm/admin/maintain_tag_templates/_edit_form.html.erb +0 -4
  284. data/app/views/crm/admin/maintain_tag_templates/_index_thead.html.erb +0 -7
  285. data/app/views/crm/admin/maintain_tag_templates/_maintain_tag_template.json.jbuilder +0 -11
  286. data/app/views/crm/admin/maintain_tag_templates/_new_form.html.erb +0 -4
  287. data/app/views/crm/admin/maintain_tag_templates/_show.json.jbuilder +0 -1
  288. data/app/views/crm/admin/maintain_tag_templates/_show_table.html.erb +0 -20
  289. data/app/views/crm/admin/maintain_tag_templates/index.json.jbuilder +0 -1
  290. data/app/views/crm/admin/maintain_tags/_breadcrumb.html.erb +0 -6
  291. data/app/views/crm/admin/maintain_tags/_edit_form.html.erb +0 -4
  292. data/app/views/crm/admin/maintain_tags/_filter_form.html.erb +0 -9
  293. data/app/views/crm/admin/maintain_tags/_index_thead.html.erb +0 -6
  294. data/app/views/crm/admin/maintain_tags/_maintain_tag.json.jbuilder +0 -9
  295. data/app/views/crm/admin/maintain_tags/_new_form.html.erb +0 -4
  296. data/app/views/crm/admin/maintain_tags/_show.json.jbuilder +0 -1
  297. data/app/views/crm/admin/maintain_tags/index.json.jbuilder +0 -1
  298. data/app/views/crm/admin/maintains/_button.html.erb +0 -3
  299. data/app/views/crm/admin/maintains/_filter_table.html.erb +0 -54
  300. data/app/views/crm/admin/maintains/_index_thead.html.erb +0 -40
  301. data/app/views/crm/admin/maintains/_index_tr.html.erb +0 -36
  302. data/app/views/crm/admin/maintains/_maintain.json.jbuilder +0 -24
  303. data/app/views/crm/admin/maintains/_new_detect.html.erb +0 -15
  304. data/app/views/crm/admin/maintains/_show.json.jbuilder +0 -1
  305. data/app/views/crm/admin/maintains/create_detect.js.erb +0 -3
  306. data/app/views/crm/admin/maintains/edit_assign.js +0 -8
  307. data/app/views/crm/admin/maintains/edit_assign.js.erb +0 -3
  308. data/app/views/crm/admin/maintains/edit_order.js.erb +0 -12
  309. data/app/views/crm/admin/maintains/edit_transfer.js +0 -8
  310. data/app/views/crm/admin/maintains/edit_transfer.js.erb +0 -3
  311. data/app/views/crm/admin/maintains/index.json.jbuilder +0 -2
  312. data/app/views/crm/admin/maintains/new.json.jbuilder +0 -5
  313. data/app/views/crm/admin/maintains/new_batch_assign.js.erb +0 -3
  314. data/app/views/crm/admin/maintains/new_detect.js.erb +0 -1
  315. data/app/views/crm/admin/maintains/orders.html.erb +0 -54
  316. data/app/views/crm/admin/maintains/public.json.jbuilder +0 -2
@@ -5,40 +5,74 @@ module Crm
5
5
  included do
6
6
  attribute :note, :string
7
7
  attribute :position, :integer
8
+ attribute :deposit_ratio, :integer, default: 100, comment: '最小预付比例'
9
+ attribute :client_type, :string, default: 'Profiled::Profile'
10
+ attribute :agent_type, :string, default: 'Profiled::Profile'
11
+ attribute :wallets_count, :integer, default: 0
12
+ attribute :cards_count, :integer, default: 0
13
+ attribute :orders_count, :integer, default: 0
8
14
 
9
- belongs_to :organ, optional: true
10
- belongs_to :member, inverse_of: :maintains, optional: true
15
+ belongs_to :organ, class_name: 'Org::Organ', optional: true
16
+ belongs_to :member, class_name: 'Org::Member', inverse_of: :maintains, optional: true
17
+ belongs_to :task_template, class_name: 'Bench::TaskTemplate', optional: true
18
+ belongs_to :payment_strategy, class_name: 'Trade::PaymentStrategy', optional: true
19
+
20
+ belongs_to :client_user, class_name: 'Auth::User', optional: true
21
+ belongs_to :client_member, class_name: 'Org::Member', optional: true
22
+ belongs_to :profile_client, class_name: 'Profiled::Profile', foreign_key: :client_id, optional: true
23
+ belongs_to :profile_agent, class_name: 'Profiled::Profile', foreign_key: :agent_id, optional: true
24
+ accepts_nested_attributes_for :profile_client, reject_if: :all_blank
25
+ accepts_nested_attributes_for :profile_agent, reject_if: :all_blank
26
+
27
+ has_many :orders, class_name: 'Trade::Order', dependent: :nullify
28
+ has_many :addresses, class_name: 'Profiled::Address', dependent: :nullify
29
+ has_many :wallets, class_name: 'Trade::Wallet', dependent: :nullify
30
+ has_many :cards, class_name: 'Trade::Card', dependent: :nullify
31
+
32
+ belongs_to :client, polymorphic: true, inverse_of: :client_maintains, autosave: true, optional: true
33
+ belongs_to :agent, polymorphic: true, inverse_of: :agent_maintains, optional: true
34
+ belongs_to :agency, optional: true
11
35
  belongs_to :maintain_source, optional: true
12
- belongs_to :task_template, optional: true
13
- belongs_to :agency, optional: true, inverse_of: :maintain
14
- belongs_to :client, class_name: 'Profile', inverse_of: :client_maintains
15
- belongs_to :agent, class_name: 'User', inverse_of: :agent_maintains, optional: true
16
- belongs_to :upstream, class_name: self.name
17
- belongs_to :source, class_name: self.name
36
+ belongs_to :upstream, class_name: self.name, optional: true
37
+ belongs_to :original, class_name: self.name, optional: true
18
38
 
19
39
  has_many :maintain_logs, dependent: :delete_all
20
40
  has_many :maintain_tags, -> { distinct }, through: :maintain_logs
21
- has_many :orders, dependent: :nullify
22
41
 
23
42
  accepts_nested_attributes_for :agency, reject_if: :all_blank
24
- accepts_nested_attributes_for :agent, reject_if: :all_blank
25
- accepts_nested_attributes_for :client, reject_if: :all_blank
26
43
 
27
44
  enum state: {
28
45
  init: 'init',
29
- transferred: 'transferred'
46
+ ordered: 'ordered'
30
47
  }, _default: 'init'
31
48
 
32
- before_validation do
33
- self.upstream ||= self
34
- self.source ||= self
35
- self.position = self.pipeline_member&.position
36
- end
37
- before_save :sync_pipeline_member, if: -> { pipeline_id_changed? }
49
+ before_validation :init_stream, if: :new_record?
50
+ before_validation :sync_pipeline_member, if: -> { task_template_id_changed? }
51
+ after_save_commit :sync_user_to_orders, if: -> { saved_change_to_client_user_id? }
52
+ after_save_commit :sync_member_to_orders, if: -> { saved_change_to_client_member_id? }
53
+ end
54
+
55
+ def init_stream
56
+ self.upstream ||= self
57
+ self.original ||= self
58
+ end
59
+
60
+ def sync_member_to_orders
61
+ return unless client_member
62
+ orders.update_all member_id: client_member_id
63
+ wallets.update_all member_id: client_member_id
64
+ cards.update_all member_id: client_member_id
65
+ end
66
+
67
+ def sync_user_to_orders
68
+ orders.update_all user_id: client_user_id
69
+ wallets.update_all user_id: client_user_id
70
+ cards.update_all user_id: client_user_id
38
71
  end
39
72
 
40
73
  def sync_pipeline_member
41
- self.pipeline_member ||= self.pipeline.pipeline_members.first if self.pipeline
74
+ #self.task_member ||= self.task_template.pipeline_members.first if self.pipeline
75
+ #self.position = self.pipeline_member&.position
42
76
  end
43
77
 
44
78
  def tags
@@ -47,13 +81,11 @@ module Crm
47
81
  end
48
82
 
49
83
  def transfer!
50
- self.state = 'transferred'
51
-
52
84
  next_member = pipeline_member&.next_member
53
85
  if next_member
54
86
  m = Maintain.new
55
87
  m.upstream = self
56
- m.source = self.source
88
+ m.original = self.original
57
89
  m.pipeline_member = next_member
58
90
  m.assign_attributes self.attributes.slice('organ_id', 'client_type', 'client_id', 'agent_type', 'agent_id', 'agency_id', 'maintain_source_id', 'pipeline_id')
59
91
 
@@ -8,8 +8,9 @@ module Crm
8
8
  attribute :tag_sequence, :integer
9
9
  attribute :extra, :json
10
10
 
11
+ belongs_to :member, class_name: 'Org::Member'
12
+
11
13
  belongs_to :maintain
12
- belongs_to :member
13
14
  belongs_to :logged, polymorphic: true, optional: true
14
15
  belongs_to :maintain_tag, counter_cache: true, optional: true
15
16
  end
@@ -5,13 +5,15 @@ module Crm
5
5
  included do
6
6
  attribute :name, :string
7
7
  attribute :maintains_count, :integer, default: 0
8
- belongs_to :organ, optional: true
9
- belongs_to :maintain_source_template, optional: true
8
+
9
+ belongs_to :organ, class_name: 'Org::Organ', optional: true
10
+
11
+ belongs_to :source, optional: true
10
12
 
11
13
  validates :name, presence: true
12
14
 
13
15
  before_validation do
14
- self.name = maintain_source_template.name if maintain_source_template
16
+ self.name ||= source.name if source
15
17
  end
16
18
  end
17
19
 
@@ -12,16 +12,17 @@ module Crm
12
12
  attribute :color, :string, default: '#2A92CA'
13
13
  attribute :maintain_logs_count, :integer, default: 0
14
14
 
15
- belongs_to :organ, optional: true
16
- belongs_to :maintain_tag_template, optional: true
15
+ belongs_to :organ, class_name: 'Org::Organ', optional: true
16
+
17
+ belongs_to :tag, optional: true
17
18
 
18
19
  validates :logged_type, uniqueness: { scope: [:organ_id, :sequence] }, allow_blank: true
19
20
  validates :name, presence: true
20
21
 
21
22
  before_validation do
22
- if maintain_tag_template
23
- self.name = maintain_tag_template.name
24
- self.color = maintain_tag_template.color
23
+ if tag
24
+ self.name = tag.name
25
+ self.color = tag.color
25
26
  self.manual = false
26
27
  end
27
28
  end
@@ -0,0 +1,54 @@
1
+ module Crm
2
+ module Model::Qrcode
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ attribute :margin_x, :integer, default: 0
7
+ attribute :margin_y, :integer, default: 0
8
+ attribute :fixed_width, :integer, default: 0
9
+
10
+ enum align: {
11
+ center: 'center',
12
+ north: 'north',
13
+ south: 'south',
14
+ west: 'west',
15
+ east: 'east',
16
+ northwest: 'northwest',
17
+ northeast: 'northeast',
18
+ southwest: 'southwest',
19
+ southeast: 'southeast'
20
+ }, _prefix: true, _default: 'northwest'
21
+
22
+ belongs_to :source
23
+ has_one_attached :picture
24
+ end
25
+
26
+ def width
27
+ if picture.attached?
28
+ picture.blob.metadata.fetch('width', 0)
29
+ else
30
+ 0
31
+ end
32
+ end
33
+
34
+ def height
35
+ if picture.attached?
36
+ picture.blob.metadata.fetch('height', 0)
37
+ else
38
+ 0
39
+ end
40
+ end
41
+
42
+ def watermark(blob = nil)
43
+ blob ||= picture
44
+ "/watermark/url/#{Base64.urlsafe_encode64('/' + [blob.service.try(:folder), blob.key].compact.join('/'))}/align/#{align}/margin/#{margin_x}x#{margin_y}/percent/#{percent}"
45
+ end
46
+
47
+ def percent
48
+ min = [source.width, source.height].min
49
+ r = (fixed_width / min.to_f) * 100
50
+ r.round
51
+ end
52
+
53
+ end
54
+ end
@@ -0,0 +1,55 @@
1
+ module Crm
2
+ module Model::Source
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ attribute :name, :string
7
+ attribute :materialize, :boolean, default: false
8
+ attribute :fixed_width, :integer, default: 0
9
+
10
+ has_one :qrcode, dependent: :destroy
11
+ has_many :qrcodes, dependent: :destroy
12
+ has_many :texts, dependent: :destroy
13
+ has_many :maintain_sources, dependent: :nullify
14
+ has_many :source_contacts
15
+
16
+ has_one_attached :picture
17
+ has_one_attached :logo
18
+ end
19
+
20
+ def width
21
+ if picture.attached?
22
+ picture.blob.metadata.fetch('width', 0)
23
+ else
24
+ 0
25
+ end
26
+ end
27
+
28
+ def height
29
+ if picture.attached?
30
+ picture.blob.metadata.fetch('height', 0)
31
+ else
32
+ 0
33
+ end
34
+ end
35
+
36
+ def h_by_w
37
+ Rational(height, width)
38
+ end
39
+
40
+ def fh
41
+ (fw * h_by_w).to_i
42
+ end
43
+
44
+ def url_with_watermark(replace = nil)
45
+ t = "/fw/#{fixed_width}"
46
+ t += qrcode.watermark(replace) if qrcode
47
+ texts.each do |text|
48
+ t += text.watermark
49
+ end
50
+
51
+ [picture.url, t.presence].compact.join('!')
52
+ end
53
+
54
+ end
55
+ end
@@ -0,0 +1,40 @@
1
+ module Crm
2
+ module Model::SourceContact
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ belongs_to :organ, class_name: 'Org::Organ', optional: true
7
+
8
+ belongs_to :maintain_source
9
+ belongs_to :source
10
+ belongs_to :contact, class_name: 'Wechat::Contact'
11
+ belongs_to :trade_item, class_name: 'Trade::TradeItem', optional: true
12
+
13
+ has_one :qy_media, class_name: 'Wechat::QyMedia', as: :medium
14
+ end
15
+
16
+ def url_with_watermark
17
+ source.url_with_watermark(contact.file)
18
+ end
19
+
20
+ def to_qy_media
21
+ r = nil
22
+ Tempfile.open do |file|
23
+ file.binmode
24
+ res = HTTPX.get url_with_watermark
25
+ res.body.each do |fragment|
26
+ file.write fragment
27
+ end if res.error.nil?
28
+
29
+ file.rewind
30
+ qy_media || build_qy_media(corp_id: contact.corp_id, suite_id: contact.suite_id)
31
+ r = qy_media.corp.api.uploadimg(file)
32
+ qy_media.url = r['url']
33
+ qy_media.save
34
+ logger.debug "#{r}"
35
+ end
36
+ r
37
+ end
38
+
39
+ end
40
+ end
@@ -1,5 +1,5 @@
1
1
  module Crm
2
- module Model::MaintainTagTemplate
2
+ module Model::Tag
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
@@ -0,0 +1,45 @@
1
+ module Crm
2
+ module Model::Text
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ attribute :note, :string
7
+ attribute :margin_x, :integer, default: 0
8
+ attribute :margin_y, :integer, default: 0
9
+
10
+ enum font: {
11
+ simsun: 'simsun',
12
+ simhei: 'simhei',
13
+ simkai: 'simkai',
14
+ simli: 'simli',
15
+ simyou: 'simyou',
16
+ simfang: 'simfang',
17
+ sc: 'sc',
18
+ tc: 'tc',
19
+ arial: 'arial',
20
+ georgia: 'georgia',
21
+ helvetica: 'helvetica',
22
+ roman: 'roman'
23
+ }, _prefix: true, _default: 'simsun'
24
+
25
+ enum align: {
26
+ center: 'center',
27
+ north: 'north',
28
+ south: 'south',
29
+ west: 'west',
30
+ east: 'east',
31
+ northwest: 'northwest',
32
+ northeast: 'northeast',
33
+ southwest: 'southwest',
34
+ southeast: 'southeast'
35
+ }, _prefix: true, _default: 'northwest'
36
+
37
+ belongs_to :source
38
+ end
39
+
40
+ def watermark
41
+ "/watermark/text/#{Base64.urlsafe_encode64(note)}/font/#{font}/align/#{align}/margin/#{margin_x}x#{margin_y}"
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,5 @@
1
+ module Crm
2
+ class Qrcode < ApplicationRecord
3
+ include Model::Qrcode
4
+ end
5
+ end
@@ -0,0 +1,18 @@
1
+ module Crm
2
+ class Source < ApplicationRecord
3
+ include Model::Source
4
+ include Com::Ext::Taxon
5
+ include Trade::Ext::Good
6
+
7
+ def order_paid(trade_item)
8
+ maintain_source = maintain_sources.find_or_initialize_by(organ_id: trade_item.member_organ_id)
9
+
10
+ mc = source_contacts.build
11
+ mc.trade_item = trade_item
12
+ mc.maintain_source = maintain_source
13
+ mc.contact_id = Hash(trade_item.extra).fetch('contact_id')
14
+
15
+ mc.save
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,5 @@
1
+ module Crm
2
+ class SourceContact < ApplicationRecord
3
+ include Model::SourceContact
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Crm
2
+ class Tag < ApplicationRecord
3
+ include Model::Tag
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module Crm
2
+ class Text < ApplicationRecord
3
+ include Model::Text
4
+ end
5
+ end
@@ -1,13 +1,13 @@
1
- <div class="<%= active_helper(modules: 'crm/admin', active: 'menu ex-accordion is-active', item: 'menu ex-accordion') %>" data-controller="menu">
2
- <%= content_tag :div, class: 'menu-list' do %>
3
- <%= link_to t('crm.admin.maintains.index.title'), { controller: 'crm/admin/maintains' }, class: active_helper(controllers: ['maintain_logs'], 'maintains': ['index', 'show'], active: 'is-active') %>
4
- <%= link_to t('crm.admin.maintains.public.title'), { controller: 'crm/admin/maintains', action: 'public' }, class: active_helper('maintains': 'public', active: 'is-active') %>
5
- <%= link_to t('crm.admin.maintain_source_templates.index.title'), { controller: 'crm/admin/maintain_source_templates' }, class: active_helper(controllers: 'maintain_source_templates', active: 'is-active') %>
6
- <%= link_to t('crm.admin.maintain_tag_templates.index.title'), { controller: 'crm/admin/maintain_tag_templates' }, class: active_helper(controllers: 'maintain_tag_templates', active: 'is-active') -%>
7
- <% end %>
1
+ <div class="<%= active_helper(modules: ['crm/admin', 'trade/admin'], active: 'menu ex-accordion is-active', item: 'menu ex-accordion') %>" data-controller="menu empty">
8
2
  <a class="menu-label" data-action="menu#toggle">
9
- <i class="fas fa-chart-line fa-fw"></i>
3
+ <i class="fa-solid fa-chart-line fa-fw"></i>
10
4
  <span><%= t('crm.admin.title') %></span>
11
- <i class="fas dropdown"></i>
5
+ <i class="fa-solid dropdown"></i>
12
6
  </a>
7
+ <div class="menu-list">
8
+ <%= link_to t('crm.admin.maintains.index.title'), { controller: 'crm/admin/maintains' }, class: active_helper(controllers: ['maintain_logs'], 'maintains': ['index', 'show'], active: 'is-active') %>
9
+ <%= link_to t('crm.admin.maintains.public.title'), { controller: 'crm/admin/maintains', action: 'public' }, class: active_helper('maintains': 'public', active: 'is-active') %>
10
+ <%= link_to t('crm.admin.maintain_sources.index.title'), { controller: 'crm/admin/maintain_sources' }, class: active_helper(controllers: 'maintain_sources', active: 'is-active') %>
11
+ <%= link_to t('crm.admin.maintain_tags.index.title'), { controller: 'crm/admin/maintain_tags' }, class: active_helper(controllers: 'maintain_tags', active: 'is-active') %>
12
+ </div>
13
13
  </div>
@@ -0,0 +1,6 @@
1
+ <div class="breadcrumb">
2
+ <ul>
3
+ <li><%= link_to t('crm.admin.maintains.index.title'), { controller: 'maintains', action: 'index' } %></li>
4
+ <li class="is-active"><%= t('.title') %></li>
5
+ </ul>
6
+ </div>
@@ -0,0 +1,9 @@
1
+ <div class="weui-panel is-borderless">
2
+ <div data-controller="mini-program" data-mini-program-pt-class="pt-0" class="weui-panel__hd as-bar">
3
+ <%= link_to({ controller: @maintain.client_type == 'Wechat::External' ? 'wechat/me/follows' : 'maintains' }, class: 'px-4') do %>
4
+ <i class="fa-regular fa-angle-left"></i>
5
+ <% end %>
6
+ <div class="weui-title"><%= t('.title') %></div>
7
+ <i class="px-4" style="width: 48.75px"></i>
8
+ </div>
9
+ </div>
@@ -0,0 +1,4 @@
1
+ <aside class="menu is-dark">
2
+ <%= render 'brand_nav' %>
3
+ <%= render 'crm_nav' %>
4
+ </aside>
@@ -0,0 +1,12 @@
1
+ <div class="weui-panel is-borderless">
2
+ <div data-controller="mini-program" data-mini-program-pt-class="pt-0" class="weui-panel__hd as-bar">
3
+ <%= link_to({ controller: 'addresses' }, class: 'px-4') do %>
4
+ <i class="fa-regular fa-angle-left"></i>
5
+ <% end %>
6
+ <div class="weui-title has-text-grey-dark">
7
+ <span><%= @maintain.remark %></span>
8
+ <span class="pl-4"><%= t('.title') %></span>
9
+ </div>
10
+ <i class="px-4" style="width: 48.75px"></i>
11
+ </div>
12
+ </div>
@@ -0,0 +1,4 @@
1
+ <%= button_to({ action: 'order_new' }, class: 'weui-btn weui-btn_primary') do %>
2
+ <i class="fa-solid fa-plus"></i>
3
+ <span><%= t('.new') %></span>
4
+ <% end %>
@@ -0,0 +1,4 @@
1
+ <%= button_to({ action: 'from_new' }, class: 'weui-btn weui-btn_primary') do %>
2
+ <i class="fa-solid fa-plus"></i>
3
+ <span><%= t('.new') %></span>
4
+ <% end %>
@@ -0,0 +1,7 @@
1
+ <%= render 'top_bar' %>
2
+
3
+ <%= render layout: 'index_table' do %>
4
+ <%= render partial: 'index_tbody', layout: 'index_tr', collection: @addresses, as: :model %>
5
+ <% end %>
6
+
7
+ <%= paginate @addresses %>
@@ -0,0 +1,9 @@
1
+ <%= form_with theme: 'search', model: Agency.new do |f| %>
2
+ <div class="field-body">
3
+ <%= f.text_field 'pupil.real_name' %>
4
+ <div class="field is-narrow">
5
+ <%= f.submit %>
6
+ <%= link_to t('.clear'), filter_params(except: ['pupil.real_name']), class: 'button is-light' %>
7
+ </div>
8
+ </div>
9
+ <% end %>
@@ -0,0 +1,5 @@
1
+ <%= render 'error_messages', target: f.object %>
2
+ <%= f.text_field :real_name %>
3
+ <%= f.text_field :age %>
4
+ <%= f.text_field :gender %>
5
+ <%= f.text_field :note %>
@@ -0,0 +1,38 @@
1
+ <td><%= model.client.real_name %></td>
2
+ <td><%= model.client.age %></td>
3
+ <td>
4
+ <span class="ui icon label">
5
+ <i class="fa-light <%= model.client.male? ? 'fa-male' : 'fa-female' %>"></i>
6
+ <%= model.client.gender_i18n %>
7
+ </span>
8
+ </td>
9
+ <td><%= model.client.note %></td>
10
+ <td>
11
+ <% model.crowds.each do |crowd| %>
12
+ <div class="ui image label">
13
+ <%= image_tag crowd.logo if crowd.logo.present? %>
14
+ <%= crowd.name %>
15
+ <%= link_to crowd_admin_agency_path(model, crowd_id: crowd.id), method: :delete, remote: true do %>
16
+ <i class="delete icon"></i>
17
+ <% end %>
18
+ </div>
19
+ <% end %>
20
+ <%= link_to crowd_admin_agency_path(model), aria: { label: '分班' }, class: 'button is-small is-rounded is-light', remote: true do %>
21
+ <i class="hand point right icon"></i>
22
+ <% end %>
23
+ </td>
24
+ <td>
25
+ <% model.cards.each do |card| %>
26
+ <div class="ui image label">
27
+ <%= link_to card.card_uuid, admin_card_card_logs_path(card), text: true %>
28
+ <%= link_to card_admin_agency_path(model, card_id: card.id), method: :delete do %>
29
+ <i class="delete icon"></i>
30
+ <% end %>
31
+ </div>
32
+ <% end %>
33
+ </td>
34
+ <td>
35
+ <%= link_to admin_agency_path(model), class: 'button is-small is-rounded is-light', remote: true do %>
36
+ <i class="fa-light fa-circle-info"></i>
37
+ <% end %>
38
+ </td>
@@ -0,0 +1,7 @@
1
+ <th><%= Agential::Agency.human_attribute_name('client.name') %></th>
2
+ <th><%= Agential::Agency.human_attribute_name('client.age') %></th>
3
+ <th><%= Agential::Agency.human_attribute_name('client.gender') %></th>
4
+ <th><%= Agential::Agency.human_attribute_name('client.note') %></th>
5
+ <th>班级</th>
6
+ <th>会员卡</th>
7
+ <th></th>
@@ -0,0 +1,33 @@
1
+ <table class="table is-hoverable is-fullwidth">
2
+ <tbody>
3
+ <tr>
4
+ <td class="has-text-right"><%= Agency.human_attribute_name('client.real_name') %></td>
5
+ <td><%= @agency.client.real_name %></td>
6
+ </tr>
7
+ <tr>
8
+ <td class="has-text-right"><%= Agency.human_attribute_name('client.age') %></td>
9
+ <td><%= @agency.client.age %></td>
10
+ </tr>
11
+ <tr>
12
+ <td class="has-text-right"><%= Agency.human_attribute_name('client.gender') %></td>
13
+ <td><%= @agency.client.gender %></td>
14
+ </tr>
15
+ <tr>
16
+ <td class="has-text-right"><%= Agency.human_attribute_name(:note) %></td>
17
+ <td><%= @agency.client.note %></td>
18
+ </tr>
19
+ <tr>
20
+ <td class="has-text-right"><%= Agency.human_attribute_name('agent.identity') %></td>
21
+ <td>
22
+ <%= @agency.tutelar.identity %>
23
+ <% if @agency.tutelar.user && @agency.tutelar.account&.wechat_response %>
24
+ <%= image_tag @agency.tutelar.account.qrcode_url, class: 'ui small image' %>
25
+ <% else %>
26
+ <%= link_to qrcode_admin_profile_path(@agency.tutelar), method: :patch, remote: true, id: 'account_qrcode' do %>
27
+ <i class="fa-light fa-qrcode"></i>
28
+ <% end %>
29
+ <% end %>
30
+ </td>
31
+ </tr>
32
+ </tbody>
33
+ </table>
@@ -0,0 +1,6 @@
1
+ <turbo-frame id="modal">
2
+ <%= form_with url: { action: 'crowd' }, method: :patch do |f| %>
3
+ <%= f.collection_select :crowd_id, @crowds, :id, :name %>
4
+ <%= f.submit %>
5
+ <% end %>
6
+ </turbo-frame>
@@ -0,0 +1,4 @@
1
+ <aside class="menu is-dark">
2
+ <%= render 'brand_nav' %>
3
+ <%= render 'crm_nav' %>
4
+ </aside>
@@ -0,0 +1,12 @@
1
+ <div class="weui-panel is-borderless">
2
+ <div data-controller="mini-program" data-mini-program-pt-class="pt-0" class="weui-panel__hd as-bar">
3
+ <%= link_to({ controller: 'card_templates', action: 'show', id: @card.card_template_id }, class: 'px-4') do %>
4
+ <i class="fa-regular fa-angle-left"></i>
5
+ <% end %>
6
+ <div class="weui-title">
7
+ <span><%= @maintain.remark %></span>
8
+ <span class="pl-1"><%= t('.title') %></span>
9
+ </div>
10
+ <i class="px-4" style="width: 37.5px"></i>
11
+ </div>
12
+ </div>
@@ -0,0 +1,8 @@
1
+ <div class="weui-panel">
2
+ <div class="weui-panel__hd"><%= t('.title') %></div>
3
+ <div class="weui-panel__bd">
4
+ <div class="weui-cells">
5
+ <%= yield %>
6
+ </div>
7
+ </div>
8
+ </div>
@@ -0,0 +1,6 @@
1
+ <span><%= model.name %></span>
2
+ <% if @card_template_ids.include?(model.id) %>
3
+ <span class="tag is-success">已开通</span>
4
+ <% else %>
5
+ <span class="tag">未开通</span>
6
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <%= link_to({ action: 'show', id: model.id }, class: 'weui-cell weui-cell_active weui-cell_access') do %>
2
+ <div class="weui-cell__bd weui-cell_primary">
3
+ <%= yield %>
4
+ </div>
5
+ <div class="weui-cell__ft"></div>
6
+ <% end %>