dm_event 4.2.1.5

Sign up to get free protection for your applications and to get access to all the features.
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 %>