dm_event 4.2.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +23 -0
  3. data/README.md +33 -0
  4. data/Rakefile +36 -0
  5. data/app/assets/images/dm_event/payment_logos/sofort/at/100x38.png +0 -0
  6. data/app/assets/images/dm_event/payment_logos/sofort/at/200x75.png +0 -0
  7. data/app/assets/images/dm_event/payment_logos/sofort/at/250x94.png +0 -0
  8. data/app/assets/images/dm_event/payment_logos/sofort/at/28x7.png +0 -0
  9. data/app/assets/images/dm_event/payment_logos/sofort/at/320x120.png +0 -0
  10. data/app/assets/images/dm_event/payment_logos/sofort/at/42x11.png +0 -0
  11. data/app/assets/images/dm_event/payment_logos/sofort/at/75x28.png +0 -0
  12. data/app/assets/images/dm_event/payment_logos/sofort/at/icon-32x22.png +0 -0
  13. data/app/assets/images/dm_event/payment_logos/sofort/at/icon-32x24.png +0 -0
  14. data/app/assets/images/dm_event/payment_logos/sofort/at/icon-48x32.png +0 -0
  15. data/app/assets/images/dm_event/payment_logos/sofort/at/icon-48x34.png +0 -0
  16. data/app/assets/images/dm_event/payment_logos/sofort/at/icon-64x42.png +0 -0
  17. data/app/assets/images/dm_event/payment_logos/sofort/at/icon-64x44.png +0 -0
  18. data/app/assets/images/dm_event/payment_logos/sofort/be/100x38.png +0 -0
  19. data/app/assets/images/dm_event/payment_logos/sofort/be/200x75.png +0 -0
  20. data/app/assets/images/dm_event/payment_logos/sofort/be/250x94.png +0 -0
  21. data/app/assets/images/dm_event/payment_logos/sofort/be/28x7.png +0 -0
  22. data/app/assets/images/dm_event/payment_logos/sofort/be/320x120.png +0 -0
  23. data/app/assets/images/dm_event/payment_logos/sofort/be/42x11.png +0 -0
  24. data/app/assets/images/dm_event/payment_logos/sofort/be/75x28.png +0 -0
  25. data/app/assets/images/dm_event/payment_logos/sofort/be/icon-32x22.png +0 -0
  26. data/app/assets/images/dm_event/payment_logos/sofort/be/icon-32x24.png +0 -0
  27. data/app/assets/images/dm_event/payment_logos/sofort/be/icon-48x32.png +0 -0
  28. data/app/assets/images/dm_event/payment_logos/sofort/be/icon-48x34.png +0 -0
  29. data/app/assets/images/dm_event/payment_logos/sofort/be/icon-64x42.png +0 -0
  30. data/app/assets/images/dm_event/payment_logos/sofort/be/icon-64x44.png +0 -0
  31. data/app/assets/images/dm_event/payment_logos/sofort/ch/100x38.png +0 -0
  32. data/app/assets/images/dm_event/payment_logos/sofort/ch/200x75.png +0 -0
  33. data/app/assets/images/dm_event/payment_logos/sofort/ch/250x94.png +0 -0
  34. data/app/assets/images/dm_event/payment_logos/sofort/ch/28x7.png +0 -0
  35. data/app/assets/images/dm_event/payment_logos/sofort/ch/320x120.png +0 -0
  36. data/app/assets/images/dm_event/payment_logos/sofort/ch/42x11.png +0 -0
  37. data/app/assets/images/dm_event/payment_logos/sofort/ch/75x28.png +0 -0
  38. data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-32x22.png +0 -0
  39. data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-32x24.png +0 -0
  40. data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-48x32.png +0 -0
  41. data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-48x34.png +0 -0
  42. data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-64x42.png +0 -0
  43. data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-64x44.png +0 -0
  44. data/app/assets/images/dm_event/payment_logos/sofort/de/100x38.png +0 -0
  45. data/app/assets/images/dm_event/payment_logos/sofort/de/200x75.png +0 -0
  46. data/app/assets/images/dm_event/payment_logos/sofort/de/250x94.png +0 -0
  47. data/app/assets/images/dm_event/payment_logos/sofort/de/28x7.png +0 -0
  48. data/app/assets/images/dm_event/payment_logos/sofort/de/320x120.png +0 -0
  49. data/app/assets/images/dm_event/payment_logos/sofort/de/42x11.png +0 -0
  50. data/app/assets/images/dm_event/payment_logos/sofort/de/75x28.png +0 -0
  51. data/app/assets/images/dm_event/payment_logos/sofort/de/icon-32x22.png +0 -0
  52. data/app/assets/images/dm_event/payment_logos/sofort/de/icon-32x24.png +0 -0
  53. data/app/assets/images/dm_event/payment_logos/sofort/de/icon-48x32.png +0 -0
  54. data/app/assets/images/dm_event/payment_logos/sofort/de/icon-48x34.png +0 -0
  55. data/app/assets/images/dm_event/payment_logos/sofort/de/icon-64x42.png +0 -0
  56. data/app/assets/images/dm_event/payment_logos/sofort/de/icon-64x44.png +0 -0
  57. data/app/assets/images/dm_event/payment_logos/sofort/es/100x38.png +0 -0
  58. data/app/assets/images/dm_event/payment_logos/sofort/es/200x75.png +0 -0
  59. data/app/assets/images/dm_event/payment_logos/sofort/es/250x94.png +0 -0
  60. data/app/assets/images/dm_event/payment_logos/sofort/es/28x7.png +0 -0
  61. data/app/assets/images/dm_event/payment_logos/sofort/es/320x120.png +0 -0
  62. data/app/assets/images/dm_event/payment_logos/sofort/es/42x11.png +0 -0
  63. data/app/assets/images/dm_event/payment_logos/sofort/es/75x28.png +0 -0
  64. data/app/assets/images/dm_event/payment_logos/sofort/es/icon-32x22.png +0 -0
  65. data/app/assets/images/dm_event/payment_logos/sofort/es/icon-32x24.png +0 -0
  66. data/app/assets/images/dm_event/payment_logos/sofort/es/icon-48x32.png +0 -0
  67. data/app/assets/images/dm_event/payment_logos/sofort/es/icon-48x34.png +0 -0
  68. data/app/assets/images/dm_event/payment_logos/sofort/es/icon-64x42.png +0 -0
  69. data/app/assets/images/dm_event/payment_logos/sofort/es/icon-64x44.png +0 -0
  70. data/app/assets/images/dm_event/payment_logos/sofort/fr/100x38.png +0 -0
  71. data/app/assets/images/dm_event/payment_logos/sofort/fr/200x75.png +0 -0
  72. data/app/assets/images/dm_event/payment_logos/sofort/fr/250x94.png +0 -0
  73. data/app/assets/images/dm_event/payment_logos/sofort/fr/28x7.png +0 -0
  74. data/app/assets/images/dm_event/payment_logos/sofort/fr/320x120.png +0 -0
  75. data/app/assets/images/dm_event/payment_logos/sofort/fr/42x11.png +0 -0
  76. data/app/assets/images/dm_event/payment_logos/sofort/fr/75x28.png +0 -0
  77. data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-32x22.png +0 -0
  78. data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-32x24.png +0 -0
  79. data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-48x32.png +0 -0
  80. data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-48x34.png +0 -0
  81. data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-64x42.png +0 -0
  82. data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-64x44.png +0 -0
  83. data/app/assets/images/dm_event/payment_logos/sofort/it/100x38.png +0 -0
  84. data/app/assets/images/dm_event/payment_logos/sofort/it/200x75.png +0 -0
  85. data/app/assets/images/dm_event/payment_logos/sofort/it/250x94.png +0 -0
  86. data/app/assets/images/dm_event/payment_logos/sofort/it/28x7.png +0 -0
  87. data/app/assets/images/dm_event/payment_logos/sofort/it/320x120.png +0 -0
  88. data/app/assets/images/dm_event/payment_logos/sofort/it/42x11.png +0 -0
  89. data/app/assets/images/dm_event/payment_logos/sofort/it/75x28.png +0 -0
  90. data/app/assets/images/dm_event/payment_logos/sofort/it/icon-32x22.png +0 -0
  91. data/app/assets/images/dm_event/payment_logos/sofort/it/icon-32x24.png +0 -0
  92. data/app/assets/images/dm_event/payment_logos/sofort/it/icon-48x32.png +0 -0
  93. data/app/assets/images/dm_event/payment_logos/sofort/it/icon-48x34.png +0 -0
  94. data/app/assets/images/dm_event/payment_logos/sofort/it/icon-64x42.png +0 -0
  95. data/app/assets/images/dm_event/payment_logos/sofort/it/icon-64x44.png +0 -0
  96. data/app/assets/images/dm_event/payment_logos/sofort/nl/100x38.png +0 -0
  97. data/app/assets/images/dm_event/payment_logos/sofort/nl/200x75.png +0 -0
  98. data/app/assets/images/dm_event/payment_logos/sofort/nl/250x94.png +0 -0
  99. data/app/assets/images/dm_event/payment_logos/sofort/nl/28x7.png +0 -0
  100. data/app/assets/images/dm_event/payment_logos/sofort/nl/320x120.png +0 -0
  101. data/app/assets/images/dm_event/payment_logos/sofort/nl/42x11.png +0 -0
  102. data/app/assets/images/dm_event/payment_logos/sofort/nl/75x28.png +0 -0
  103. data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-32x22.png +0 -0
  104. data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-32x24.png +0 -0
  105. data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-48x32.png +0 -0
  106. data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-48x34.png +0 -0
  107. data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-64x42.png +0 -0
  108. data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-64x44.png +0 -0
  109. data/app/assets/images/dm_event/payment_logos/sofort/pl/100x38.png +0 -0
  110. data/app/assets/images/dm_event/payment_logos/sofort/pl/200x75.png +0 -0
  111. data/app/assets/images/dm_event/payment_logos/sofort/pl/250x94.png +0 -0
  112. data/app/assets/images/dm_event/payment_logos/sofort/pl/28x7.png +0 -0
  113. data/app/assets/images/dm_event/payment_logos/sofort/pl/320x120.png +0 -0
  114. data/app/assets/images/dm_event/payment_logos/sofort/pl/42x11.png +0 -0
  115. data/app/assets/images/dm_event/payment_logos/sofort/pl/75x28.png +0 -0
  116. data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-32x22.png +0 -0
  117. data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-32x24.png +0 -0
  118. data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-48x32.png +0 -0
  119. data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-48x34.png +0 -0
  120. data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-64x42.png +0 -0
  121. data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-64x44.png +0 -0
  122. data/app/assets/images/dm_event/payment_logos/sofort/uk/100x38.png +0 -0
  123. data/app/assets/images/dm_event/payment_logos/sofort/uk/200x75.png +0 -0
  124. data/app/assets/images/dm_event/payment_logos/sofort/uk/250x94.png +0 -0
  125. data/app/assets/images/dm_event/payment_logos/sofort/uk/28x7.png +0 -0
  126. data/app/assets/images/dm_event/payment_logos/sofort/uk/320x120.png +0 -0
  127. data/app/assets/images/dm_event/payment_logos/sofort/uk/42x11.png +0 -0
  128. data/app/assets/images/dm_event/payment_logos/sofort/uk/75x28.png +0 -0
  129. data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-32x22.png +0 -0
  130. data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-32x24.png +0 -0
  131. data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-48x32.png +0 -0
  132. data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-48x34.png +0 -0
  133. data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-64x42.png +0 -0
  134. data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-64x44.png +0 -0
  135. data/app/assets/javascripts/dm_event/admin.js +94 -0
  136. data/app/assets/stylesheets/dm_event/admin.css +152 -0
  137. data/app/assets/stylesheets/dm_event/application.css +65 -0
  138. data/app/controllers/dm_event/admin/admin_controller.rb +13 -0
  139. data/app/controllers/dm_event/admin/registrations_controller.rb +411 -0
  140. data/app/controllers/dm_event/admin/workshop_prices_controller.rb +73 -0
  141. data/app/controllers/dm_event/admin/workshops_controller.rb +147 -0
  142. data/app/controllers/dm_event/application_controller.rb +23 -0
  143. data/app/controllers/dm_event/payments_controller.rb +83 -0
  144. data/app/controllers/dm_event/registrations_controller.rb +368 -0
  145. data/app/datatables/registration_datatable.rb +117 -0
  146. data/app/helpers/dm_event/application_helper.rb +4 -0
  147. data/app/helpers/dm_event/registrations_helper.rb +14 -0
  148. data/app/helpers/dm_event/workshops_helper.rb +41 -0
  149. data/app/mailers/payment_reminder_mailer.rb +25 -0
  150. data/app/mailers/registration_notify_mailer.rb +31 -0
  151. data/app/models/dm_event/concerns/ability.rb +38 -0
  152. data/app/models/dm_event/concerns/registration_state_email.rb +80 -0
  153. data/app/models/dm_event/concerns/registration_state_machine.rb +218 -0
  154. data/app/models/dm_event/concerns/user_profile.rb +20 -0
  155. data/app/models/dm_event/model_decorators.rb +6 -0
  156. data/app/models/dm_event/permitted_params.rb +35 -0
  157. data/app/models/payment.rb +48 -0
  158. data/app/models/registration.rb +297 -0
  159. data/app/models/workshop.rb +247 -0
  160. data/app/models/workshop_price.rb +118 -0
  161. data/app/presenters/event_common_presenter.rb +31 -0
  162. data/app/presenters/registration_presenter.rb +34 -0
  163. data/app/presenters/workshop_presenter.rb +22 -0
  164. data/app/views/dm_event/admin/registrations/_form.html.erb +297 -0
  165. data/app/views/dm_event/admin/registrations/action_state.js.erb +1 -0
  166. data/app/views/dm_event/admin/registrations/edit.html.erb +1 -0
  167. data/app/views/dm_event/admin/registrations/index.html.erb +0 -0
  168. data/app/views/dm_event/admin/workshop_prices/_form.html.erb +62 -0
  169. data/app/views/dm_event/admin/workshop_prices/edit.html.erb +2 -0
  170. data/app/views/dm_event/admin/workshop_prices/index.html.erb +31 -0
  171. data/app/views/dm_event/admin/workshop_prices/new.html.erb +2 -0
  172. data/app/views/dm_event/admin/workshops/_form.html.erb +61 -0
  173. data/app/views/dm_event/admin/workshops/_header_menu.html.erb +21 -0
  174. data/app/views/dm_event/admin/workshops/_registration_stats.html.erb +58 -0
  175. data/app/views/dm_event/admin/workshops/additional_configuration.html.erb +47 -0
  176. data/app/views/dm_event/admin/workshops/edit.html.erb +2 -0
  177. data/app/views/dm_event/admin/workshops/edit_system_email.html.erb +75 -0
  178. data/app/views/dm_event/admin/workshops/financials.html.erb +179 -0
  179. data/app/views/dm_event/admin/workshops/index.html.erb +100 -0
  180. data/app/views/dm_event/admin/workshops/lost_users.html.erb +44 -0
  181. data/app/views/dm_event/admin/workshops/new.html.erb +2 -0
  182. data/app/views/dm_event/admin/workshops/show.html.erb +47 -0
  183. data/app/views/dm_event/admin/workshops/user_outstanding_balances.html.erb +29 -0
  184. data/app/views/dm_event/liquid_tags/_funding_project_status.html.erb +27 -0
  185. data/app/views/dm_event/payments/_registrations_paypal_standard.html.erb +23 -0
  186. data/app/views/dm_event/payments/_registrations_sofort.html.erb +18 -0
  187. data/app/views/dm_event/registrations/_section_address.html.erb +30 -0
  188. data/app/views/dm_event/registrations/_section_custom_fields.html.erb +7 -0
  189. data/app/views/dm_event/registrations/_section_prices.html.erb +33 -0
  190. data/app/views/dm_event/registrations/_workshop_price.html.erb +18 -0
  191. data/app/views/dm_event/registrations/choose_payment.html.erb +5 -0
  192. data/app/views/dm_event/registrations/closed.html.erb +14 -0
  193. data/app/views/dm_event/registrations/new.html.erb +30 -0
  194. data/app/views/dm_event/registrations/success.html.erb +15 -0
  195. data/app/views/layouts/email_templates/dm_event_email_layout.html.erb +318 -0
  196. data/app/views/layouts/email_templates/dm_event_email_layout.text.erb +1 -0
  197. data/app/views/layouts/email_templates/dm_event_payment_reminder.html.erb +22 -0
  198. data/app/views/layouts/email_templates/dm_event_payment_reminder.text.erb +19 -0
  199. data/app/views/layouts/email_templates/dm_event_registration_notify.html.erb +21 -0
  200. data/app/views/layouts/email_templates/dm_event_registration_notify.text.erb +13 -0
  201. data/config/initializers/dm_event.rb +1 -0
  202. data/config/initializers/liquid_init.rb +2 -0
  203. data/config/locales/ems.cs.yml +51 -0
  204. data/config/locales/ems.de.yml +51 -0
  205. data/config/locales/ems.en.yml +51 -0
  206. data/config/locales/ems.fi.yml +51 -0
  207. data/config/locales/ems.ja.yml +51 -0
  208. data/config/routes.rb +40 -0
  209. data/db/migrate/20130510155617_create_events.rb +98 -0
  210. data/db/migrate/20130516124327_add_locale_to_registration.rb +5 -0
  211. data/db/migrate/20130516204454_add_user_profile_to_registration.rb +11 -0
  212. data/db/migrate/20130518092324_add_require_address.rb +7 -0
  213. data/db/migrate/20130609145812_add_workshop_published.rb +5 -0
  214. data/db/migrate/20130624134506_add_amount_currency.rb +16 -0
  215. data/db/migrate/20130703131515_add_workshop_currency.rb +5 -0
  216. data/db/migrate/20130913083529_add_event_funding_type.rb +6 -0
  217. data/db/migrate/20130914105736_add_enable_payments.rb +5 -0
  218. data/db/migrate/20130916160033_add_sidebar_to_workshop.rb +5 -0
  219. data/db/migrate/20130917161700_add_show_address.rb +5 -0
  220. data/db/migrate/20131116180719_add_default_funding_goal.rb +8 -0
  221. data/db/migrate/20131127165445_add_payment_reminder.rb +5 -0
  222. data/db/migrate/20140122204702_add_event_image.rb +5 -0
  223. data/db/migrate/20140523165342_add_workshop_summary.rb +5 -0
  224. data/db/migrate/20140605052208_add_uuid_to_registration.rb +10 -0
  225. data/db/migrate/20140707152124_add_registration_comment_count.rb +5 -0
  226. data/db/migrate/20140708142312_add_payment_comment.rb +20 -0
  227. data/db/migrate/20150709125105_add_payment_reminder_history.rb +16 -0
  228. data/db/migrate/20160810081542_add_bcc_contact_email.rb +5 -0
  229. data/db/migrate/20160821150120_index_foreign_keys_in_ems_registrations.rb +9 -0
  230. data/db/migrate/20160821150121_index_foreign_keys_in_ems_workshop_price_translations.rb +5 -0
  231. data/db/migrate/20160821150122_index_foreign_keys_in_ems_workshop_prices.rb +6 -0
  232. data/db/migrate/20160821150123_index_foreign_keys_in_ems_workshop_translations.rb +5 -0
  233. data/db/migrate/20160821150124_index_foreign_keys_in_ems_workshops.rb +6 -0
  234. data/lib/dm_event/engine.rb +20 -0
  235. data/lib/dm_event/liquid/tags/funding_project_status.rb +55 -0
  236. data/lib/dm_event.rb +4 -0
  237. data/lib/tasks/dm_event_tasks.rake +4 -0
  238. data/spec/controllers/registrations_controller_spec.rb +152 -0
  239. data/spec/dummy/README.rdoc +28 -0
  240. data/spec/dummy/Rakefile +6 -0
  241. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  242. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  243. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  244. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  245. data/spec/dummy/app/models/ability.rb +10 -0
  246. data/spec/dummy/app/models/user.rb +6 -0
  247. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  248. data/spec/dummy/bin/bundle +3 -0
  249. data/spec/dummy/bin/rails +4 -0
  250. data/spec/dummy/bin/rake +4 -0
  251. data/spec/dummy/config/application.rb +26 -0
  252. data/spec/dummy/config/boot.rb +5 -0
  253. data/spec/dummy/config/database.yml +25 -0
  254. data/spec/dummy/config/environment.rb +5 -0
  255. data/spec/dummy/config/environments/development.rb +37 -0
  256. data/spec/dummy/config/environments/production.rb +82 -0
  257. data/spec/dummy/config/environments/test.rb +39 -0
  258. data/spec/dummy/config/initializers/assets.rb +8 -0
  259. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  260. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  261. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  262. data/spec/dummy/config/initializers/inflections.rb +16 -0
  263. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  264. data/spec/dummy/config/initializers/session_store.rb +3 -0
  265. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  266. data/spec/dummy/config/locales/en.yml +23 -0
  267. data/spec/dummy/config/routes.rb +11 -0
  268. data/spec/dummy/config/secrets.yml +22 -0
  269. data/spec/dummy/config.ru +4 -0
  270. data/spec/dummy/db/development.sqlite3 +0 -0
  271. data/spec/dummy/db/migrate/20141114170927_add_globalize_countries.dm_core.rb +50 -0
  272. data/spec/dummy/db/migrate/20141114170928_devise_create_users.dm_core.rb +46 -0
  273. data/spec/dummy/db/migrate/20141114170929_add_user_fields.dm_core.rb +14 -0
  274. data/spec/dummy/db/migrate/20141114170930_rolify_create_roles.dm_core.rb +20 -0
  275. data/spec/dummy/db/migrate/20141114170931_add_last_access.dm_core.rb +10 -0
  276. data/spec/dummy/db/migrate/20141114170932_create_versions.dm_core.rb +19 -0
  277. data/spec/dummy/db/migrate/20141114170933_add_object_changes_column_to_versions.dm_core.rb +12 -0
  278. data/spec/dummy/db/migrate/20141114170934_create_dm_core_accounts.dm_core.rb +13 -0
  279. data/spec/dummy/db/migrate/20141114170935_add_account_to_users.dm_core.rb +9 -0
  280. data/spec/dummy/db/migrate/20141114170936_create_preferences.dm_core.rb +13 -0
  281. data/spec/dummy/db/migrate/20141114170937_create_comments.dm_core.rb +22 -0
  282. data/spec/dummy/db/migrate/20141114170938_add_activity.dm_core.rb +21 -0
  283. data/spec/dummy/db/migrate/20141114170939_add_type_to_comments.dm_core.rb +9 -0
  284. data/spec/dummy/db/migrate/20141114170940_add_category.dm_core.rb +28 -0
  285. data/spec/dummy/db/migrate/20141114170941_create_email_table.dm_core.rb +26 -0
  286. data/spec/dummy/db/migrate/20141114170942_add_user_profile.dm_core.rb +46 -0
  287. data/spec/dummy/db/migrate/20141114170943_add_profile_email.dm_core.rb +14 -0
  288. data/spec/dummy/db/migrate/20141114170944_create_payment_history.dm_core.rb +37 -0
  289. data/spec/dummy/db/migrate/20141114170945_change_anchor_field.dm_core.rb +10 -0
  290. data/spec/dummy/db/migrate/20141114170946_create_user_site_profile.dm_core.rb +27 -0
  291. data/spec/dummy/db/migrate/20141114170947_add_avatar.dm_core.rb +12 -0
  292. data/spec/dummy/db/migrate/20141114170948_add_notify_to_payment_history.dm_core.rb +8 -0
  293. data/spec/dummy/db/migrate/20141114170949_acts_as_votable_migration.dm_core.rb +28 -0
  294. data/spec/dummy/db/migrate/20141114170950_add_user_site_profile_uuid.dm_core.rb +19 -0
  295. data/spec/dummy/db/migrate/20141114170951_add_invoice_id.dm_core.rb +7 -0
  296. data/spec/dummy/db/migrate/20141114170952_acts_as_follower_migration.dm_core.rb +18 -0
  297. data/spec/dummy/db/migrate/20141114170953_rename_invoice_id.dm_core.rb +12 -0
  298. data/spec/dummy/db/migrate/20141114170954_add_core_addresses.dm_core.rb +18 -0
  299. data/spec/dummy/db/migrate/20141114170955_papertrail_increase_column.dm_core.rb +9 -0
  300. data/spec/dummy/db/migrate/20141114170956_acts_as_taggable_on_migration.dm_core.rb +32 -0
  301. data/spec/dummy/db/migrate/20141114170957_add_missing_unique_indices.dm_core.rb +23 -0
  302. data/spec/dummy/db/migrate/20141114170958_add_taggings_counter_cache_to_tags.dm_core.rb +16 -0
  303. data/spec/dummy/db/migrate/20141114170959_create_custom_fields.dm_core.rb +40 -0
  304. data/spec/dummy/db/migrate/20141114170960_add_missing_taggable_index.dm_core.rb +11 -0
  305. data/spec/dummy/db/migrate/20141119103740_create_cms.dm_cms.rb +92 -0
  306. data/spec/dummy/db/migrate/20141119103741_add_account_to_cms.dm_cms.rb +11 -0
  307. data/spec/dummy/db/migrate/20141119103742_create_blog.dm_cms.rb +62 -0
  308. data/spec/dummy/db/migrate/20141119103743_add_notification_sent.dm_cms.rb +6 -0
  309. data/spec/dummy/db/migrate/20141119103744_add_blog_comment.dm_cms.rb +8 -0
  310. data/spec/dummy/db/migrate/20141119103745_add_blog_image.dm_cms.rb +6 -0
  311. data/spec/dummy/db/migrate/20141119103746_rename_snippet_slug.dm_cms.rb +14 -0
  312. data/spec/dummy/db/migrate/20141119103747_add_requires_subscription_blog.dm_cms.rb +8 -0
  313. data/spec/dummy/db/migrate/20141119103748_add_pages_ranked_model.dm_cms.rb +23 -0
  314. data/spec/dummy/db/migrate/20141119103749_add_blog_owner.dm_cms.rb +7 -0
  315. data/spec/dummy/db/migrate/20141119103750_create_media_files.dm_cms.rb +30 -0
  316. data/spec/dummy/db/migrate/20141119103751_add_cmspage_summary.dm_cms.rb +7 -0
  317. data/spec/dummy/db/migrate/20141119103752_add_blog_image_email_header.dm_cms.rb +6 -0
  318. data/spec/dummy/db/migrate/20141119103753_add_header_image.dm_cms.rb +10 -0
  319. data/spec/dummy/db/migrate/20160128154135_add_favored_locale.dm_core.rb +17 -0
  320. data/spec/dummy/db/migrate/20160128154136_update_papertrail_v4.dm_core.rb +41 -0
  321. data/spec/dummy/db/schema.rb +677 -0
  322. data/spec/dummy/public/404.html +67 -0
  323. data/spec/dummy/public/422.html +67 -0
  324. data/spec/dummy/public/500.html +66 -0
  325. data/spec/dummy/public/favicon.ico +0 -0
  326. data/spec/factories/account_factory.rb +7 -0
  327. data/spec/factories/registration_factory.rb +13 -0
  328. data/spec/factories/workshop_factory.rb +25 -0
  329. data/spec/factories/workshop_price_factory.rb +19 -0
  330. data/spec/models/registration_spec.rb +83 -0
  331. data/spec/models/workshop_spec.rb +26 -0
  332. data/spec/rails_helper.rb +70 -0
  333. data/spec/spec_helper.rb +85 -0
  334. data/spec/support/accounts.rb +17 -0
  335. data/spec/support/devise.rb +44 -0
  336. data/spec/support/fix_locale.rb +57 -0
  337. metadata +520 -0
@@ -0,0 +1,58 @@
1
+ <%= subsection title: 'Registration Statistics' do %>
2
+ <% num_registrations = workshop.registrations.count %>
3
+ <div class="block progress-statistics">
4
+ <% num = workshop.registrations.number_of(:attending) %>
5
+ <%= slim_progress_bar(label: 'Attending', value: "#{num} / #{num.percent_of(num_registrations).to_s}%", color: 'success', percentage: num.percent_of(num_registrations)) %>
6
+ <% if (num = workshop.registrations.number_of(:pending)) > 0 %>
7
+ <%= slim_progress_bar(label: 'Pending', value: "#{num}", color: 'pending', percentage: num.percent_of(num_registrations)) %>
8
+ <% end %>
9
+ <% num = workshop.registrations.number_of(:accepted) %>
10
+ <%= slim_progress_bar(label: 'Accepted', value: "#{num}", color: 'accepted', percentage: num.percent_of(num_registrations)) %>
11
+ <% num = workshop.registrations.number_of(:paid) %>
12
+ <%= slim_progress_bar(label: 'Paid', value: "#{num}", color: 'paid', percentage: num.percent_of(num_registrations)) %>
13
+ <% if (num = workshop.registrations.number_of(:waitlisted)) > 0 %>
14
+ <%= slim_progress_bar(label: 'Waitlisted', value: "#{num}", color: 'waitlisted', percentage: num.percent_of(num_registrations)) %>
15
+ <% end %>
16
+ <% if (num = workshop.registrations.number_of(:reviewing)) > 0 %>
17
+ <%= slim_progress_bar(label: 'Reviewing', value: "#{num}", color: 'reviewing', percentage: num.percent_of(num_registrations)) %>
18
+ <% end %>
19
+ <% if (num = workshop.registrations.number_of(:rejected)) > 0 %>
20
+ <%= slim_progress_bar(label: 'Rejected', value: "#{num}", color: 'rejected', percentage: num.percent_of(num_registrations)) %>
21
+ <% end %>
22
+ <% if (num = workshop.registrations.number_of(:canceled)) > 0 %>
23
+ <%= slim_progress_bar(label: 'Canceled', value: "#{num}", color: 'canceled', percentage: num.percent_of(num_registrations)) %>
24
+ <% end %>
25
+ <% if (num = workshop.registrations.number_of(:refunded)) > 0 %>
26
+ <%= slim_progress_bar(label: 'Refunded', value: "#{num}", color: 'refunded', percentage: num.percent_of(num_registrations)) %>
27
+ <% end %>
28
+ <% if (num = workshop.registrations.number_of(:noshow)) > 0 %>
29
+ <%= slim_progress_bar(label: 'No Show', value: "#{num}", color: 'noshow', percentage: num.percent_of(num_registrations)) %>
30
+ <% end %>
31
+ </div>
32
+ <% end %>
33
+
34
+ <% unless @workshop.workshop_prices.empty? %>
35
+ <%= subsection title: 'Price Distribution' do %>
36
+ <% financials = @workshop.financial_details(:summary) %>
37
+ <ul class="statistics statistics-small statistics-linear">
38
+ <li><%= stat_block_small label: 'Best', number: financials[:summary][:total_possible].format(no_cents_if_whole: true), color_type: :info, icon: 'icon-coin', percent: 100 %></li>
39
+ <li><%= stat_block_small label: 'Worst (80%)', number: financials[:summary][:total_possible_worst].format(no_cents_if_whole: true), color_type: :warning, icon: 'icon-coin', percent: 80 %></li>
40
+ <li><%= stat_block_small label: 'Paid', number: financials[:summary][:total_paid].format(no_cents_if_whole: true), color_type: :success, icon: 'icon-coin', percent: financials[:summary][:total_paid_percent] %></li>
41
+ </ul>
42
+ <%= link_to 'Financial Details', financials_admin_workshop_url(@workshop) %>
43
+ <hr>
44
+ <div class="block progress-statistics">
45
+ <% num_attending = workshop.registrations.number_of(:attending) %>
46
+ <% workshop.registrations.number_of(:for_all_prices).each do |price_id, registration_count| %>
47
+ <% if price_id %>
48
+ <% price = WorkshopPrice.find_by_id(price_id ) %>
49
+ <%= slim_progress_bar(label: price.price_formatted, value: registration_count, color: 'success',
50
+ percentage: registration_count.percent_of(num_attending), bottom_label: price.price_description) %>
51
+ <% else %>
52
+ <%= slim_progress_bar(label: 'no pricing selected', value: registration_count, color: 'noshow',
53
+ percentage: registration_count.percent_of(num_attending), bottom_label: '') %>
54
+ <% end %>
55
+ <% end %>
56
+ </div>
57
+ <% end %>
58
+ <% end %>
@@ -0,0 +1,47 @@
1
+ <%= render partial: 'header_menu' %>
2
+ <% content_for :content_title, "Additional Configuration <small>#{@workshop.title}</small>".html_safe %>
3
+
4
+ <% submit_url = additional_configuration_admin_workshop_path %>
5
+ <%= simple_form_for @workshop, url: submit_url,
6
+ html: { class: 'form-horizontal' }, wrapper: :bs3_horizontal_form, wrapper_mappings: DmAdmin::FormWrapperMappings do |f| %>
7
+
8
+ <%= f.error_notification message: "Please review the problems below" %>
9
+
10
+ <%= panel header: false do %>
11
+ <%= subsection title: 'Visual and Social Settings' do %>
12
+ <%= f.input :preferred_header_accent_color, label: 'Accent Color', hint: 'Accent color used in header (if supported by theme). Any valid CSS color' %>
13
+ <%= f.input :preferred_show_social_buttons, as: :boolean, label: 'Show social buttons' %>
14
+ <%= f.input :image, label: 'Workshop Image', hint: 'Image used as a banner to the registration page. Also used for Facebook.' %>
15
+ <%= locale_tabs do |locale| %>
16
+ <%= f.input "summary_#{locale}", label: 'Workshop Summary', as: :code_editor, input_html: {style: "height: 100px;"},
17
+ hint: 'Text used when a workshop is liked on Facebook. This text will not be visible on the registration page.' %>
18
+ <% end %>
19
+ <% end %>
20
+
21
+ <%= subsection title: 'Associated Blog & Forum' do %>
22
+ <p style="margin:10px;">
23
+ Select a blog and forum to be associated with this event. Any paid or accepted registrations will automatically be granted access
24
+ to them.
25
+ </p>
26
+
27
+ <%= f.input :cms_blog, label: 'Blog', collection: CmsBlog.where(['owner_id = ? OR owner_id IS NULL', @workshop.id]), selected: @workshop.cms_blog.try(:id), include_blank: true %>
28
+ <%= f.input :forum, label: 'Forum', collection: Forum.where(['owner_id = ? OR owner_id IS NULL', @workshop.id]), selected: @workshop.forum.try(:id), include_blank: true %>
29
+ <% end %>
30
+
31
+ <%= subsection title: 'Custom Fields' do %>
32
+ <%= f.simple_fields_for :custom_field_defs do |builder| %>
33
+ <%= render 'dm_core/admin/custom_fields/custom_field_def_fields', f: builder %>
34
+ <% end %>
35
+ <%= link_to_add_custom_fields 'Add Field', f, :custom_field_defs %>
36
+ <% end %>
37
+
38
+ <%= submit_or_cancel cancel_url: (@workshop.new_record? ? admin_workshops_url : admin_workshop_path(@workshop)) %>
39
+
40
+ <% end %>
41
+
42
+ <div class="block-inner">
43
+ <%= link_to 'Clear Facebook Cache', "https://developers.facebook.com/tools/debug/og/object?q=#{ERB::Util.url_encode(dm_event.register_new_url(@workshop))}",
44
+ target: '_blank', class: 'btn btn-xs btn-default' %>
45
+ </div>
46
+
47
+ <% end %>
@@ -0,0 +1,2 @@
1
+ <% content_for :content_title, "Edit Workshop <small>#{@workshop.title}</small>".html_safe %>
2
+ <%= render 'form' %>
@@ -0,0 +1,75 @@
1
+ <% content_for :content_title, "#{@system_email.email_type.capitalize} Email <small>#{@workshop.title}</small>".html_safe %>
2
+ <%= render partial: 'header_menu' %>
3
+
4
+ <%= panel header: false do %>
5
+ <div class="callout callout-info">
6
+ <% case @system_email.email_type %>
7
+ <% when 'pending' %>
8
+ <p>When someone registers for an event, you can decide whether they automatically get "accepted" &mdash;
9
+ meaning they actually have a seat reserved &mdash; or they can be placed in "pending", which means
10
+ their registration must first be reviewed and accepted.</p>
11
+ <% when 'accepted' %>
12
+ <p class="explanation">When you either accept a registration, or you did not require the registration to be reviewed,
13
+ this is the state the registration will be in. It indicates the person has a reserved seat in
14
+ the event/course.</p>
15
+ <p class="explanation">The email should include any event specific information, including any payment details,
16
+ special timings, directions, special instructions, etc.</p>
17
+ <% when 'paid'%>
18
+ <p>Once the registration has been marked paid, this email will get sent to them. If it's left empty, no email will be sent.</p>
19
+ <% when 'waitlisted' %>
20
+ <p class="explanation">If the event becomes full, you can place someone on the waitlist.</p>
21
+ <% when 'rejected' %>
22
+ <p class="explanation">If you reject the registration, this email will get sent to them. If it's left empty, no email will be sent.
23
+ You should then notify as you see fit.</p>
24
+ <% end %>
25
+
26
+ <div class="panel-group" id="template_variables" role="tablist" aria-multiselectable="true">
27
+ <div class="panel panel-default">
28
+ <div class="panel-heading" role="tab" id="headingOne">
29
+ <h4 class="panel-title">
30
+ <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="false" aria-controls="collapseOne">
31
+ Useful Template Variables
32
+ </a>
33
+ </h4>
34
+ </div>
35
+ <div id="collapseOne" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingOne">
36
+ <div class="panel-body">
37
+ <p>You can use special template variables in the email, such as the registrants name or the payment instructions. The
38
+ variables you can use are listed below. </p>
39
+ <ul class="mono_spaced">
40
+ <li>{{event.price}}</li>
41
+ <li>{{event.fullname}}</li>
42
+ <li>{{event.title}}</li>
43
+ <li>{{event.receipt_code}}</li>
44
+ <li>{{event.price_description}}</li>
45
+ <li>{{event.balance}}</li>
46
+ <li>{{event.start_date}}</li>
47
+ <li>{{event.end_date}}</li>
48
+ <li>{{event.start_time}}</li>
49
+ <li>{{event.end_time}}</li>
50
+ <li>{{event.date_range}}</li>
51
+ <li>{{payment_details}}</li>
52
+ </ul>
53
+ </div>
54
+ </div>
55
+ </div>
56
+ </div>
57
+
58
+ </div>
59
+
60
+ <% submit_url = edit_system_email_admin_workshop_path(@workshop, @system_email.email_type) %>
61
+ <%= simple_form_for @system_email, url: submit_url,
62
+ html: { class: 'form-horizontal' }, wrapper: :bs3_horizontal_form, wrapper_mappings: DmAdmin::FormWrapperMappings do |f| %>
63
+
64
+ <%= f.error_notification message: "Please review the problems below" %>
65
+ <%= locale_tabs title: '' do |locale| %>
66
+ <%= f.input "subject_#{locale}", label: 'Email Subject', id: 'title_error', required: true %>
67
+ <div class="col-sm-12">
68
+ <%= f.input "body_#{locale}", label: 'Email Body', hint: 'Markdown format', wrapper: :bs3_vertical_form, as: :code_editor, input_html: {style: "height: 200px;"} %>
69
+ </div>
70
+ <% end %>
71
+
72
+ <%= submit_or_cancel cancel_url: admin_workshop_path(@workshop) %>
73
+ <% end %>
74
+
75
+ <% end %>
@@ -0,0 +1,179 @@
1
+ <% content_for :content_title, "Financial Details <small>#{@workshop.title}</small>".html_safe %>
2
+
3
+ <% content_for :content_title_extra do %>
4
+ <%= page_header_buttons do %>
5
+ <%= link_to 'View Registrations', [:admin, @workshop], class: 'btn btn-xs btn-default' %>
6
+ <% end %>
7
+ <% end %>
8
+
9
+ <div class="row">
10
+ <div class="col-md-12">
11
+ <%= panel title: 'Summary' do %>
12
+ <div class="row">
13
+ <div class="chart col-md-6" style="height: 185px;margin-bottom:20px;" id="payment_outstanding_chart"
14
+ data-values="<%= [ {label: "Paid: #{@financials[:summary][:total_paid].format(no_cents_if_whole: true, symbol: true)}",
15
+ data: @financials[:summary][:total_paid].to_f, color: '#4DB24A' },
16
+ {label: "Outstanding: #{@financials[:summary][:total_outstanding].format(no_cents_if_whole: true, symbol: true)}",
17
+ data: @financials[:summary][:total_outstanding].to_f, color: '#F24E50' }
18
+ ].to_json %>">
19
+ </div>
20
+
21
+ <div class="col-md-6">
22
+ <table class="table table-bordered table-condensed" style="margin-top:10px">
23
+ <thead>
24
+ <tr>
25
+ <th class="name"></th>
26
+ <th class="cost">Best</th>
27
+ <th class="cost">Worst <small>(80%)</small></th>
28
+ </tr>
29
+ </thead>
30
+ <tbody>
31
+ <tr>
32
+ <th><strong>Projected Revenue</strong></th>
33
+ <td class="cost"><%= @financials[:summary][:total_possible].format(no_cents_if_whole: true, symbol: true) %></td>
34
+ <td class="cost"><%= @financials[:summary][:total_possible_worst].format(no_cents_if_whole: true, symbol: true) %></td>
35
+ </tr>
36
+ <tr>
37
+ <th><strong>Outstanding</strong></th>
38
+ <td class="cost"><%= @financials[:summary][:total_outstanding].format(no_cents_if_whole: true, symbol: true) %></td>
39
+ <td class="cost"><%= @financials[:summary][:total_outstanding_worst].format(no_cents_if_whole: true, symbol: true) %></td>
40
+ </tr>
41
+ <tr>
42
+ <th><strong class="text-success">Paid</strong></th>
43
+ <td colspan="2" class="cost"><%= @financials[:summary][:total_paid].format(no_cents_if_whole: true, symbol: true) %></td>
44
+ </tr>
45
+ <tr>
46
+ <th><strong class="text-warning">Discounts given</strong></th>
47
+ <td colspan="2" class="cost"><%= @workshop.registrations.number_of :discounted %> / <%= @workshop.registrations.number_of(:discounted_total).format(no_cents_if_whole: true, symbol: true) %></td>
48
+ </tr>
49
+ </tbody>
50
+ </table>
51
+ </div>
52
+ </div>
53
+ <% end %>
54
+ </div>
55
+ </div>
56
+
57
+ <div class="row">
58
+ <div class="col-md-6">
59
+ <%= panel title: 'Collected Payments by Month' do %>
60
+ <div class="row">
61
+ <div class="col-md-7 chart" style="height: 200px" id="collected_monthly_chart"
62
+ data-values="<%= financial_collected_monthly_json(@financials[:collected_monthly]) %>"
63
+ data-currencysymbol="<%= Money.new(0, @workshop.base_currency).symbol %>" >
64
+ </div>
65
+ <div class="col-md-5">
66
+ <table class="table table-bordered table-condensed" style="margin-top:10px">
67
+ <tbody>
68
+ <% @financials[:collected_monthly].sort.each_with_index do |item, index| -%>
69
+ <tr>
70
+ <td class="name"><%= item[0].localize("%b %Y") %></td>
71
+ <td class="cost" style="text-align: right;"><%= @financials[:collected_monthly][item[0]].format(no_cents_if_whole: true, symbol: true) %></td>
72
+ </tr>
73
+ <% end %>
74
+ </tbody>
75
+ </table>
76
+ </div>
77
+ </div>
78
+ <% end %>
79
+ </div>
80
+ <div class="col-md-6">
81
+ <%= panel title: 'Collected Payments by Method' do %>
82
+ <div class="chart" style="width: 100%;height: 185px;" id="collected_chart" data-values="<%= financial_collected_json(@financials[:collected]) %>">
83
+ </div>
84
+ <% end %>
85
+ </div>
86
+ </div>
87
+
88
+ <% unpaid = @workshop.registrations.unpaid.order('payment_reminder_sent_on ASC') %>
89
+ <% toolbar = toolbar_btn('Send Payment Reminders', send_payment_reminder_emails_admin_workshop_path(@workshop, registration_id: :all), class: 'btn btn-xs btn-info', method: :patch, data: {confirm: "Are you sure you wish to send a reminder email to those eligible?"}) %>
90
+ <%= panel body: false, title: "#{unpaid.count} Unpaid Participants", toolbar: toolbar do %>
91
+ <table class="table table-bordered table-condensed table-striped">
92
+ <thead>
93
+ <tr>
94
+ <th class="receipt_code">Receipt</th>
95
+ <th class="name">Name</th>
96
+ <th class="cost">Balance</th>
97
+ <th class="date">Registered</th>
98
+ <th class="date">Reminded</th>
99
+ <th></th>
100
+ </tr>
101
+ </thead>
102
+ <tbody>
103
+ <% unpaid.each do |registration| -%>
104
+ <tr>
105
+ <td class="receipt_code" style="white-space:nowrap"><%= registration.receipt_code %></td>
106
+ <td class="name"><%= link_to registration.full_name, dm_event.edit_admin_registration_path(registration) %> </td>
107
+ <td class="cost"><%= registration.balance_owed.format %><%= content_tag(:span, icons('icon-bubble2 inside-content', size: 12), class: 'pull-right') if registration.private_comments.count > 0 %></td>
108
+ <td class="date" style="white-space:nowrap"><%= format_date(registration.created_at) %></td>
109
+ <td class="date" <%= "style='background-color: #B3D4FD;'".html_safe if registration.payment_reminder_due? %>>
110
+ <% if registration.payment_reminder_sent_on.nil? %>
111
+ not yet
112
+ <% elsif registration.payment_reminder_history.count < 2 %>
113
+ <%= "#{distance_of_time_in_words_to_now(registration.payment_reminder_sent_on)} ago" %>
114
+ <% else %>
115
+ <div class="btn-group">
116
+ <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
117
+ <%= "#{distance_of_time_in_words_to_now(registration.payment_reminder_sent_on)} ago" %> <span class="caret"></span>
118
+ </button>
119
+ <ul class="dropdown-menu">
120
+ <% registration.payment_reminder_history.each do |date| %>
121
+ <li><a><%= "#{distance_of_time_in_words_to_now(date)} ago" %></a></li>
122
+ <% end %>
123
+ </ul>
124
+ </div>
125
+ <% end %>
126
+ </td>
127
+ <td>
128
+ <%= link_to 'Send', send_payment_reminder_emails_admin_workshop_path(@workshop, registration_id: registration.id), title: 'Send reminder now', class: 'btn btn-xs btn-default', method: :patch, data: {confirm: "Are you sure you wish to send a reminder email to this person?"} %>
129
+ </td>
130
+ </tr>
131
+ <% end %>
132
+ </tbody>
133
+ </table>
134
+ <% end %>
135
+
136
+ <%= panel body: false, title: 'List of Payments' do %>
137
+ <table class="table table-bordered table-condensed table-striped">
138
+ <thead>
139
+ <tr>
140
+ <th class="date">Date</th>
141
+ <th class="name">Name</th>
142
+ <th class="item_id">Item ID / Description</th>
143
+ <th class="cost">Paid</th>
144
+ <th class="payment_method">Payment Method</th>
145
+ <th class="type">Recorded By</th>
146
+ </tr>
147
+ </thead>
148
+ <tbody>
149
+ <% @payments.sort { |x, y| x.payment_date <=> y.payment_date }.each_with_index do |payment, index| -%>
150
+ <tr>
151
+ <td class="date" style="white-space:nowrap"><%= format_date(payment.payment_date) %></td>
152
+ <td class="name"><%= link_to payment.owner.full_name, dm_event.edit_admin_registration_path(payment.owner) %></td>
153
+ <td class="item_id"><%= payment.item_ref %></td>
154
+ <td class="cost"><%= payment.total.format(no_cents_if_whole: true, symbol: true) %></td>
155
+ <td class="payment_method" style="white-space:nowrap"><%= payment.payment_method.titleize %></td>
156
+ <td class="type"><%= payment.user_profile.nil? ? 'Automated' : payment.user_profile.public_name %></td>
157
+ </tr>
158
+ <% if !payment.bill_to_name.blank? || payment.discount.to_i > 0 || (!payment.order_details.nil? && !payment.order_details['coupon'].nil?) %>
159
+ <tr>
160
+ <td></td>
161
+ <td colspan="5">
162
+ <ul class="row_detail">
163
+ <% unless payment.bill_to_name.blank? %>
164
+ <li><strong>Payed by:</strong> <%=h payment.bill_to_name %></li>
165
+ <% end %>
166
+ <% if payment.discount.to_i > 0 %>
167
+ <li><strong>Discount:</strong> <%=h payment.discount %></li>
168
+ <% end %>
169
+ <% unless payment.order_details.nil? || payment.order_details['coupon'].nil? %>
170
+ <li><strong>Coupon Code:</strong> <%=h payment.order_details['coupon']['coupon_code'] %></li>
171
+ <% end %>
172
+ </ul>
173
+ </td>
174
+ </tr>
175
+ <% end %>
176
+ <% end %>
177
+ </tbody>
178
+ </table>
179
+ <% end %>
@@ -0,0 +1,100 @@
1
+ <% content_for :content_title, 'Workshop Dashboard' %>
2
+ <% content_for :content_title_extra do %>
3
+ <%= page_header_buttons do %>
4
+ <%= link_to('Outstanding Balances', admin_workshop_user_outstanding_balances_path, title: 'Outstanding Balances', class: "btn btn-xs btn-default") %>
5
+ <%= link_to(icon_label(:new, 'New'), new_admin_workshop_path, title: 'New Workshop', class: "btn btn-xs btn-default") %>
6
+ <% end %>
7
+ <% end %>
8
+
9
+ <% @workshops.in_groups_of(2, false) do |workshop_row| %>
10
+ <div class="row">
11
+ <% for workshop in workshop_row %>
12
+ <% panel_class = workshop.registration_closed? ? 'panel-default' : 'panel-success' %>
13
+ <div class="col-md-6">
14
+ <%= panel title: link_to(workshop.title, [:admin, workshop]), subtitle: present(workshop).start_end_date, class: panel_class do %>
15
+ <% financials = workshop.financial_details(:summary) %>
16
+ <ul class="statistics">
17
+ <li><%= stat_block_small label: 'Projected', number: financials[:summary][:total_possible].format(no_cents_if_whole: true), color_type: :info, icon: 'icon-coin', percent: 100 %></li>
18
+ <li><%= stat_block_small label: 'Paid', number: financials[:summary][:total_paid].format(no_cents_if_whole: true), color_type: :success, icon: 'icon-coin', percent: financials[:summary][:total_paid_percent] %></li>
19
+ <li><%= stat_block_small label: 'Unpaid', number: financials[:summary][:total_outstanding].format(no_cents_if_whole: true), color_type: :danger, icon: 'icon-coin', percent: 80 %></li>
20
+ </ul>
21
+
22
+ <div class="separator-reflected" style="margin: 10px 0px;"></div>
23
+ <% num_registrations = workshop.registrations.count %>
24
+ <div class="block progress-statistics">
25
+ <% num = workshop.registrations.number_of(:attending) %>
26
+ <%= slim_progress_bar(label: 'Attending', value: "#{num} / #{num.percent_of(num_registrations).to_s}%", color: 'success', percentage: num.percent_of(num_registrations)) %>
27
+ </div>
28
+ <div class="row">
29
+ <div class="col-md-6">
30
+ <div class="block well progress-statistics">
31
+ <div class="body">
32
+ <% num = workshop.registrations.number_of(:accepted) %>
33
+ <%= slim_progress_bar(label: 'Accepted', value: "#{num}", color: 'accepted', percentage: num.percent_of(num_registrations)) %>
34
+ <% num = workshop.registrations.number_of(:paid) %>
35
+ <div class="semi-block">
36
+ <%= slim_progress_bar(label: 'Paid', value: "#{num}", color: 'paid', percentage: num.percent_of(num_registrations)) %>
37
+ </div>
38
+ <% num = workshop.registrations.number_of(:pending) %>
39
+ <div class="semi-block">
40
+ <%= slim_progress_bar(label: 'Pending', value: "#{num}", color: 'pending', percentage: num.percent_of(num_registrations)) %>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ <div class="col-md-6">
46
+ <div class="block well progress-statistics">
47
+ <div class="body">
48
+ <% num = workshop.registrations.number_of(:waitlisted) %>
49
+ <%= slim_progress_bar(label: 'Waitlisted', value: "#{num}", color: 'waitlisted', percentage: num.percent_of(num_registrations)) %>
50
+ <% num = workshop.registrations.number_of(:reviewing) %>
51
+ <div class="semi-block">
52
+ <%= slim_progress_bar(label: 'Reviewing', value: "#{num}", color: 'reviewing', percentage: num.percent_of(num_registrations)) %>
53
+ </div>
54
+ </div>
55
+ </div>
56
+ </div>
57
+ </div>
58
+
59
+ <% end %>
60
+ </div>
61
+ <% end %>
62
+ </div>
63
+ <% end %>
64
+
65
+ <% unless @workshops_past.empty? %>
66
+ <%= panel body: false, title: 'Past Workshops' do %>
67
+ <table class="table table-striped table-bordered table-block">
68
+ <thead>
69
+ <tr>
70
+ <th>Title</th>
71
+ <th>Projected</th>
72
+ <th>Paid</th>
73
+ <th>Unpaid</th>
74
+ <th width="150">Date</th>
75
+ </tr>
76
+ </thead>
77
+ <tbody>
78
+ <% @workshops_past.each do |workshop| %>
79
+ <% # TODO very ineffecient to do for each workshop. look at caching values %>
80
+ <% financials = workshop.financial_details(:summary) %>
81
+ <% present workshop do |workshop_presenter| %>
82
+ <tr class="item" data-item_id="<%= workshop.id %>">
83
+ <td>
84
+ <%= link_to workshop.title, [:admin, workshop] %>
85
+ </td>
86
+ <td><%= financials[:summary][:total_possible].format(no_cents_if_whole: true) %></td>
87
+ <td><span class="text-success"><%= financials[:summary][:total_paid].format(no_cents_if_whole: true) %></span></td>
88
+ <td>
89
+ <%= '<span class="text-danger">'.html_safe if financials[:summary][:total_outstanding].positive? %>
90
+ <%= financials[:summary][:total_outstanding].format(no_cents_if_whole: true) %>
91
+ <%= '</span>'.html_safe if financials[:summary][:total_outstanding].positive? %>
92
+ </td>
93
+ <td><%= workshop_presenter.start_end_date %></td>
94
+ </tr>
95
+ <% end %>
96
+ <% end %>
97
+ </tbody>
98
+ </table>
99
+ <% end %>
100
+ <% end %>
@@ -0,0 +1,44 @@
1
+ <% content_for :content_title, "Lost Users" %>
2
+ <% content_for :content_subtitle, "#{@workshop.title}" %>
3
+
4
+ <%= panel body: false, title: "#{@lost_users.count} Potential Lost Users" do %>
5
+ <div class="panel-body">
6
+ <div class="row">
7
+ <div class="col-md-8">
8
+ <p>Provides a list of users who have created accounts in the past <strong><%= @days_ago %> days</strong> and who
9
+ have <strong>not</strong> registered for any workshops yet. It gives the opportunity to detect
10
+ users who got lost between registering as a new user and registering for a workshop.</p>
11
+ </div>
12
+ <div class="col-md-4">
13
+ <%= simple_form_for :lost_users, url: lost_users_admin_workshop_url(@workshop),
14
+ html: { class: 'form-inline' }, wrapper: :bs3_vertical_form, wrapper_mappings: DmAdmin::FormWrapperMappings do |f| %>
15
+ <%= f.input :days_ago, label: 'Number of days', wrapper: :bs3_vertical_group do %>
16
+ <%= f.input_field :days_ago, class: 'form-control', value: @days_ago %>
17
+ <%= content_tag :span, class: "input-group-btn" do %>
18
+ <button class="btn btn-default" type="submit">Check</button>
19
+ <% end %>
20
+ <% end %>
21
+ <% end %>
22
+ </div>
23
+ </div>
24
+ </div>
25
+
26
+ <table class="table table-bordered table-condensed table-striped">
27
+ <thead>
28
+ <tr>
29
+ <th>User</th>
30
+ <th>Email</th>
31
+ <th class="date">Created On</th>
32
+ </tr>
33
+ </thead>
34
+ <tbody>
35
+ <% @lost_users.each do |user| %>
36
+ <tr>
37
+ <td><%= user.full_name %></td>
38
+ <td><%= user.email %></td>
39
+ <td><%= format_date(user.created_at) %></td>
40
+ </tr>
41
+ <% end %>
42
+ </tbody>
43
+ </table>
44
+ <% end %>
@@ -0,0 +1,2 @@
1
+ <% content_for :content_title, 'New Workshop' %>
2
+ <%= render 'form' %>
@@ -0,0 +1,47 @@
1
+ <% content_for :content_title, "#{@workshop.title}" %>
2
+ <% content_for :content_subtitle, present(@workshop).label_published %>
3
+ <% content_for :content_title_extra do %>
4
+ <%= page_header_buttons do %>
5
+ <div class="btn-group">
6
+ <button class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown"><i class="icon-cog"></i> <span class="caret"></span></button>
7
+ <ul class="dropdown-menu dropdown-menu-right icons-right">
8
+ <li><%= link_to label_icon('Edit Workshop', :edit), edit_admin_workshop_url(@workshop) %></li>
9
+ <li><%= link_to label_icon('Financial Details', 'icon-coin'), financials_admin_workshop_url(@workshop) %></li>
10
+ <li><%= link_to label_icon('Show Duplicates', 'icon-copy'), admin_workshop_url(@workshop, duplicates: '1') %></li>
11
+ <li><%= link_to label_icon('Lost Users', 'icon-users'), lost_users_admin_workshop_url(@workshop) %></li>
12
+ <li><%= link_to 'Export Registrations (.csv)', admin_workshop_url(@workshop, format: 'csv') %></li>
13
+
14
+ </ul>
15
+ </div>
16
+ <% end %>
17
+ <% end %>
18
+
19
+ <div class="row">
20
+ <div class="col-md-9">
21
+ <% toolbar = toolbar_btn(icons(:new), register_new_url(@workshop), target: '_blank', title: 'New Registration', class: "btn btn-link btn-icon") %>
22
+ <% title = params[:duplicates].nil? ? 'Registrations' : 'Registrations (Duplicates)'%>
23
+ <%= panel title: title, toolbar: toolbar, body: false do %>
24
+ <table id="registration_table" class="table table-striped table-bordered" data-source="<%= dm_event.admin_workshop_url(@workshop, duplicates: params[:duplicates]) %>">
25
+ <thead>
26
+ <tr>
27
+ <th width=20></th>
28
+ <th width=50>Receipt</th>
29
+ <th>Name</th>
30
+ <th width=25>Balance</th>
31
+ <th width=85>Registered</th>
32
+ <th width=85>Last Login</th>
33
+ </tr>
34
+ </thead>
35
+ <tbody>
36
+ </tbody>
37
+ </table>
38
+ <% end %>
39
+ </div>
40
+
41
+ <div class="col-md-3">
42
+ <%= panel header: false do %>
43
+ <%= render partial: 'registration_stats', locals: {workshop: @workshop} %>
44
+ <% end %>
45
+ </div>
46
+ </div>
47
+
@@ -0,0 +1,29 @@
1
+ <% content_for :content_title, "Outstanding Payments<small>by user</small>".html_safe %>
2
+
3
+ <%= panel body: false, title: "#{@unpaid.count} Unpaid Participants" do %>
4
+ <table class="table table-bordered table-condensed table-striped">
5
+ <thead>
6
+ <tr>
7
+ <th>&nbsp;&nbsp;</th>
8
+ <th>Workshop</th>
9
+ <th class="receipt_code">Receipt</th>
10
+ <th class="cost">Balance</th>
11
+ <th class="date">Registered</th>
12
+ </tr>
13
+ </thead>
14
+ <% @unpaid.each do |item| -%>
15
+ <tbody>
16
+ <tr><th scope="rowgroup" colspan="5"><strong><%= item[0] %></strong></th></tr>
17
+ <% item[1].each do |registration| %>
18
+ <tr>
19
+ <td>&nbsp;&nbsp;</td>
20
+ <td><%= link_to registration.workshop.title, edit_admin_registration_path(registration) %></td>
21
+ <td class="receipt_code" style="white-space:nowrap"><%= registration.receipt_code %></td>
22
+ <td class="cost"><%= registration.balance_owed.format %></td>
23
+ <td class="date" style="white-space:nowrap"><%= format_date(registration.created_at) %></td>
24
+ </tr>
25
+ <% end %>
26
+ </tbody>
27
+ <% end %>
28
+ </table>
29
+ <% end %>
@@ -0,0 +1,27 @@
1
+ <% workshop = Workshop.find(workshop_id) %>
2
+ <% percent = workshop.total_paid.cents.percent_of(workshop.funding_goal.cents) %>
3
+ <div markdown="0" class="donation_card <%= div_class %>" style="<%= div_style %>">
4
+ <%= image_tag image %>
5
+ <div class="progress_bar" data-value="<%= percent %>"><span> <%= "#{percent}%" %> / <%= workshop.funding_goal.format(:no_cents => true) %></span></div>
6
+ <div class="donation_card_text clear">
7
+ <%= content.html_safe %>
8
+ </div>
9
+ <div class="donate_button">
10
+ <a href="<%= button_link.blank? ? '#ticket_information' : button_link %>">
11
+ <%= button_text.blank? ? I18n.t("ems.donate_button") : button_text %>
12
+ </a>
13
+ </div>
14
+ </div>
15
+
16
+ <% if false %>
17
+ <div markdown="0" class="donation_status">
18
+ <div class="progress_bar" data-value="<%= percent %>"><span> <%= "#{percent}%" %> / <%= workshop.funding_goal.format(:no_cents => true) %></span></div>
19
+ <div class="donation_status_text">
20
+ <h2 class="goal"><%= I18n.t 'ems.project_goal' %></h2>
21
+ <h2 class="goal_amount"><%= workshop.funding_goal.format(:no_cents => true) %></h2>
22
+ <h2 class="raised"><%= I18n.t 'ems.amount_raised' %></h2>
23
+ <h2 class="raised_amount"><%= workshop.total_paid.format(:no_cents => true) %></h2>
24
+ </div>
25
+ <div class="donate_button"><a href="<%= button_link %>"><%= button_text %></a></div>
26
+ </div>
27
+ <% end %>