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,152 @@
1
+ /* @override
2
+ http://dev.kaleshwar.de:3000/assets/dm_event/admin.css?body=1
3
+ http://dev.kaleshwar.de:3200/assets/dm_event/admin.css?body=1 */
4
+
5
+ /*=== color for various state labels/status boxes ===*/
6
+
7
+ .submitted_color { color: #c0c700;}
8
+ .label-submitted, .badge-submitted { background-color: #c0c700; }
9
+ .label-submitted[href], .badge-submitted[href] { background-color: #c0c700;}
10
+
11
+ .drafted_color, .bounced_color { color: #8b8b89;}
12
+ .label-drafted, .badge-drafted { background-color: #8b8b89; }
13
+ .label-drafted[href], .badge-drafted[href] { background-color: #8b8b89;}
14
+ .label-bounced, .badge-bounced { background-color: #8b8b89; }
15
+ .label-bounced[href], .badge-bounced[href] { background-color: #8b8b89;}
16
+
17
+ .pending_color, .unconfirmed_color, .suspended_color { color: #c0c700;}
18
+ .label-pending, .badge-pending { background-color: #c0c700; }
19
+ .label-pending[href], .badge-pending[href] { background-color: #c0c700;}
20
+ .label-unconfirmed, .badge-unconfirmed { background-color: #c0c700; }
21
+ .label-unconfirmed[href], .badge-unconfirmed[href] { background-color: #c0c700;}
22
+ .label-suspended, .badge-suspended { background-color: #c0c700; }
23
+ .label-suspended[href], .badge-suspended[href] { background-color: #c0c700;}
24
+ .btn-pending, .progress-bar-pending {
25
+ background-color: #c0c700 !important;
26
+ }
27
+ .btn-pending .caret { border-top-color: #fff; border-bottom-color: #fff; }
28
+ .btn-pending:active, .btn-pending.active, .btn-group.open .btn-pending.dropdown-toggle {
29
+ border-color: #adb401;
30
+ background-color: #c7ce37;
31
+ }
32
+
33
+ .reviewing_color { color: #838200;}
34
+ .label-reviewing, .badge-reviewing { background-color: #838200; }
35
+ .label-reviewing[href], .badge-reviewing[href] { background-color: #838200;}
36
+ .btn-reviewing, .progress-bar-reviewing {
37
+ background-color: #838200 !important;
38
+ }
39
+ .btn-reviewing .caret { border-top-color: #fff; border-bottom-color: #fff; }
40
+ .btn-reviewing:active, .btn-reviewing.active, .btn-group.open .btn-reviewing.dropdown-toggle {
41
+ border-color: #838200;
42
+ background-color: #838200;
43
+ }
44
+
45
+ .accepted_color, .approved_color, .subscribed_color { color: #4a48ff;}
46
+ .label-accepted, .badge-accepted { background-color: #4a48ff; }
47
+ .label-accepted[href], .badge-accepted[href] { background-color: #4a48ff;}
48
+ .label-approved, .badge-approved { background-color: #4a48ff; }
49
+ .label-approved[href], .badge-approved[href] { background-color: #4a48ff;}
50
+ .label-subscribed, .badge-subscribed { background-color: #4a48ff; }
51
+ .label-subscribed[href], .badge-subscribed[href] { background-color: #4a48ff;}
52
+ .btn-accepted, .progress-bar-accepted {
53
+ background-color: #4a48ff !important;
54
+ }
55
+ .btn-accepted .caret { border-top-color: #fff; border-bottom-color: #fff; }
56
+ .btn-accepted:active, .btn-accepted.active, .btn-group.open .btn-accepted.dropdown-toggle {
57
+ border-color: #4a48ff;
58
+ background-color: #4a48ff;
59
+ }
60
+
61
+ .paid_color, .certified_color { color: #049727;}
62
+ .label-paid, .badge-paid { background-color: #049727; }
63
+ .label-paid[href], .badge-paid[href] { background-color: #049727;}
64
+ .label-certified, .badge-certified { background-color: #049727; }
65
+ .label-certified[href], .badge-certified[href] { background-color: #049727;}
66
+ .btn-paid, .progress-bar-paid {
67
+ background-color: #049727 !important;
68
+ }
69
+ .btn-paid .caret { border-top-color: #fff; border-bottom-color: #fff; }
70
+ .btn-paid:active, .btn-paid.active, .btn-group.open .btn-paid.dropdown-toggle {
71
+ border-color: #199526;
72
+ background-color: #199526;
73
+ }
74
+
75
+ .waitlisted_color { color: #d38100;}
76
+ .label-waitlisted, .badge-waitlisted { background-color: #d38100; }
77
+ .label-waitlisted[href], .badge-waitlisted[href] { background-color: #d38100;}
78
+ .btn-waitlisted, .progress-bar-waitlisted {
79
+ background-color: #d38100 !important;
80
+ }
81
+ .btn-waitlisted .caret { border-top-color: #fff; border-bottom-color: #fff; }
82
+ .btn-waitlisted:active, .btn-waitlisted.active, .btn-group.open .btn-waitlisted.dropdown-toggle {
83
+ border-color: #d38100;
84
+ background-color: #d38100;
85
+ }
86
+
87
+ .canceled_color { color: #8d248f;}
88
+ .label-canceled, .badge-canceled { background-color: #8d248f; }
89
+ .label-canceled[href], .badge-canceled[href] { background-color: #8d248f;}
90
+ .btn-canceled, .progress-bar-canceled {
91
+ background-color: #8d248f !important;
92
+ }
93
+ .btn-canceled .caret { border-top-color: #fff; border-bottom-color: #fff; }
94
+ .btn-canceled:active, .btn-canceled.active, .btn-group.open .btn-canceled.dropdown-toggle {
95
+ border-color: #8d248f;
96
+ background-color: #8d248f;
97
+ }
98
+
99
+ .rejected_color, .unsubscribed_color { color: #d10029;}
100
+ .label-rejected, .badge-rejected { background-color: #d10029; }
101
+ .label-rejected[href], .badge-rejected[href] { background-color: #d10029;}
102
+ .label-unsubscribed, .badge-unsubscribed { background-color: #d10029; }
103
+ .label-unsubscribed[href], .badge-unsubscribed[href] { background-color: #d10029;}
104
+ .btn-rejected, .progress-bar-rejected {
105
+ background-color: #d10029 !important;
106
+ }
107
+ .btn-rejected .caret { border-top-color: #fff; border-bottom-color: #fff; }
108
+ .btn-rejected:active, .btn-rejected.active, .btn-group.open .btn-rejected.dropdown-toggle {
109
+ border-color: #d10029;
110
+ background-color: #d10029;
111
+ }
112
+
113
+ .refunded_color { color: #b89ebc;}
114
+ .label-refunded, .badge-refunded { background-color: #b89ebc; }
115
+ .label-refunded[href], .badge-refunded[href] { background-color: #b89ebc;}
116
+ .btn-refunded, .progress-bar-refunded {
117
+ background-color: #b89ebc !important;
118
+ }
119
+ .btn-refunded .caret { border-top-color: #fff; border-bottom-color: #fff; }
120
+ .btn-refunded:active, .btn-refunded.active, .btn-group.open .btn-refunded.dropdown-toggle {
121
+ border-color: #b89ebc;
122
+ background-color: #b89ebc;
123
+ }
124
+
125
+ .noshow_color { color: #444;}
126
+ .label-noshow, .badge-noshow { background-color: #444; }
127
+ .label-noshow[href], .badge-noshow[href] { background-color: #444;}
128
+ .btn-noshow, .progress-bar-noshow {
129
+ background-color: #444 !important;
130
+ }
131
+ .btn-noshow .caret { border-top-color: #fff; border-bottom-color: #fff; }
132
+ .btn-noshow:active, .btn-noshow.active, .btn-group.open .btn-noshow.dropdown-toggle {
133
+ border-color: #444;
134
+ background-color: #444;
135
+ }
136
+
137
+ .workshop_price_list li { margin-bottom: 15px; list-style-type: none;}
138
+ .workshop_price_list input { float: left; }
139
+ .workshop_price_list .price_details { margin-left: 30px; }
140
+
141
+ .price_details .price { font-weight: bold; }
142
+ .price_details .sub_description {
143
+ margin-left: 0px;
144
+ font-style: italic;
145
+ }
146
+ .price_details .expires { margin-left: 20px; }
147
+
148
+ .balance_paid {color: green;}
149
+ .balance_owed {color: red;}
150
+
151
+
152
+
@@ -0,0 +1,65 @@
1
+ /* @override
2
+ http://dev.kaleshwar.de:3000/assets/dm_event/application.css?body=1 */
3
+
4
+ /*
5
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
6
+ * listed below.
7
+ *
8
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
9
+ * or vendor/assets/stylesheets of plugins, if any, can be referenced here using a relative path.
10
+ *
11
+ * You're free to add application-wide styles to this file and they'll appear at the top of the
12
+ * compiled file, but it's generally better to create a new file per style scope.
13
+ *
14
+ *= require_self
15
+ */
16
+
17
+ .workshop_price_list {
18
+ margin-left: 20px;
19
+ margin-bottom: 30px;
20
+ }
21
+
22
+ .workshop_price_list li { margin-bottom: 15px; }
23
+ .workshop_price_list input { float: left; }
24
+ .workshop_price_list .price_details { margin-left: 30px; }
25
+
26
+ .price_details .price { font-weight: bold; }
27
+ .price_details .sub_description {
28
+ margin-left: 20px;
29
+ font-style: italic;
30
+ }
31
+ .price_details .expires { margin-left: 20px; }
32
+
33
+ .receipt_section h2 {
34
+ margin-bottom: 20px;
35
+ }
36
+
37
+ .receipt_section .ticket {
38
+ background-image: -webkit-gradient(linear, left bottom, left top, from(#f6f6f6), to(#ffffff));
39
+ background-image: -moz-linear-gradient(90deg, #f6f6f6 0%, #ffffff 100%);
40
+ border: 1px solid #ddd;
41
+ padding: 10px;
42
+ margin-bottom: 20px;
43
+ width: auto;
44
+ }
45
+
46
+ .receipt_section .ticket h3 {
47
+ text-align: center;
48
+ }
49
+ .receipt_section .ticket li {
50
+ display: block;
51
+ }
52
+ .receipt_section .ticket li span {
53
+ font-weight: bold;
54
+ margin-right: 20px;
55
+ width: 150px;
56
+ display: inline-block;
57
+ text-align: left;
58
+ }
59
+
60
+ .receipt_section .ticket { width: 100%; overflow: hidden; }
61
+ .receipt_section .ticket ul { list-style: none; position: relative; float: left; display: block; left: 50%; }
62
+ .receipt_section .ticket ul li { position: relative;
63
+ display: block; right: 50%; }
64
+
65
+ .registration_closed h2 { margin-bottom: 20px;}
@@ -0,0 +1,13 @@
1
+ class DmEvent::Admin::AdminController < DmCore::Admin::AdminController
2
+ before_filter :authorize_access
3
+
4
+ protected
5
+
6
+ #------------------------------------------------------------------------------
7
+ def authorize_access
8
+ unless can?(:manage_events, :all)
9
+ flash[:alert] = "Unauthorized Access!"
10
+ redirect_to current_account.index_path
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,411 @@
1
+ class DmEvent::Admin::RegistrationsController < DmEvent::Admin::AdminController
2
+ include DmEvent::PermittedParams
3
+
4
+ helper DmEvent::RegistrationsHelper
5
+
6
+ #------------------------------------------------------------------------------
7
+ def action_state
8
+ @registration = Registration.find(params[:id])
9
+ @state_event = params[:state_event].downcase
10
+ case @state_event
11
+ # when 'verify payment'
12
+ # @registration.verify_payment
13
+ # when 'archive', 'unarchive'
14
+ # @registration.toggle_archive
15
+ # when 'confirm', 'unconfirm'
16
+ # @registration.toggle_confirm
17
+ when 'take action'
18
+ flash[:error] = "Please select an action to take"
19
+ else
20
+ #--- send to state machine if it's an allowed event
21
+ @registration.send("#{@state_event}!") if @registration.aasm.events.include? @state_event.to_sym
22
+ end
23
+
24
+ respond_to do |format|
25
+ format.html { redirect_to admin_workshop(@registration.workshop) }
26
+ format.js { render :action => :action_state }
27
+ end
28
+
29
+ rescue ActiveRecord::StaleObjectError
30
+ end
31
+
32
+ #------------------------------------------------------------------------------
33
+ def destroy
34
+ registration = Registration.find(params[:id])
35
+ registration.destroy
36
+ redirect_to admin_workshop_url(registration.workshop), notice: 'Registration was successfully deleted.'
37
+ end
38
+
39
+ #------------------------------------------------------------------------------
40
+ def edit
41
+ @registration = Registration.find(params[:id])
42
+ @workshop = @registration.workshop
43
+ end
44
+
45
+ #------------------------------------------------------------------------------
46
+ def update
47
+ @registration = Registration.find(params[:id])
48
+ @workshop = @registration.workshop
49
+
50
+ #--- save without validation, so can update without having to fill in all details
51
+ payment_comment_text = params[:registration].delete(:payment_comment_text)
52
+ @registration.attributes = registration_params
53
+
54
+ if @registration.save(:validate => false)
55
+ if @registration.payment_comment.nil? && payment_comment_text
56
+ #--- save the payment text as a comment, and keep a pointer to it
57
+ payment_comment = @registration.private_comments.create(body: payment_comment_text, user_id: current_user.id)
58
+ @registration.reload.update_attribute(:payment_comment_id, payment_comment.id)
59
+ end
60
+ redirect_to admin_workshop_url(@workshop), notice: 'Registration was successfully updated.'
61
+ else
62
+ render :action => :edit
63
+ end
64
+ rescue ActiveRecord::StaleObjectError
65
+ redirect_to :action => :edit, :id => @registration, :alert => 'Changes not saved - registration was modified by someone else'
66
+ end
67
+
68
+ # Record a new payment for the event
69
+ #------------------------------------------------------------------------------
70
+ def ajax_payment
71
+ @registration = Registration.find(params[:id])
72
+ @workshop = @registration.workshop
73
+ previous_payment = params[:payment_id] ? PaymentHistory.find(params[:payment_id]) : nil
74
+ @payment_history = @registration.manual_payment(previous_payment,
75
+ params[:payment_history][:cost],
76
+ params[:payment_history][:total_currency],
77
+ current_user.user_profile,
78
+ item_ref: params[:payment_history][:item_ref],
79
+ payment_method: params[:payment_history][:payment_method],
80
+ bill_to_name: params[:payment_history][:bill_to_name],
81
+ payment_date: params[:payment_history][:payment_date]
82
+ )
83
+
84
+ if @payment_history.errors.empty?
85
+ @registration.update_attribute(:receipt_requested, params[:payment_history][:receipt_requested])
86
+ end
87
+
88
+ respond_to do |format|
89
+ format.html {
90
+ flash[:notice] = "Payment was successfully added" if @payment_history.errors.empty?
91
+ flash[:alert] = "There was a problem adding this payment" unless @payment_history.errors.empty?
92
+ redirect_to edit_admin_registration_path(@registration)
93
+ }
94
+ format.js { render :action => :ajax_payment }
95
+ end
96
+ end
97
+
98
+ #------------------------------------------------------------------------------
99
+ def ajax_delete_payment
100
+ @registration = Registration.find(params[:id])
101
+ if @registration.delete_payment(params[:payment_id])
102
+ redirect_to edit_admin_registration_path(@registration), notice: 'Payment was deleted'
103
+ else
104
+ redirect_to edit_admin_registration_path(@registration), error: 'Problem deleting payment'
105
+ end
106
+ end
107
+
108
+ =begin
109
+
110
+ #------------------------------------------------------------------------------
111
+ def checkin
112
+ unless params[:id] == nil
113
+ @workshop = EventWorkshop.find_by_id(params[:id])
114
+ permit "#{SystemRoles::Checkin} on :workshop or #{SystemRoles::Moderator} on :workshop or #{SystemRoles::Moderator} on :event or #{SystemRoles::Admin} on Event or #{SystemRoles::System}", :event => @workshop.event
115
+
116
+ sort_init 'created_at', 'asc', nil, nil, false, true
117
+ sort_update
118
+
119
+ query = @workshop.event_registration.includes(:event_payment, :student, :country).order(sort_clause)
120
+ query = query.where(
121
+ "event_registrations.process_state = 'paid' OR
122
+ event_registrations.process_state = 'accepted' OR
123
+ event_registrations.process_state = 'refunded'")
124
+ query = query.where('event_registrations.archived_on IS NULL')
125
+
126
+ @show_all = true
127
+ if params[:commit] == 'Search'
128
+ wildname = params[:name].sql_wildcard
129
+ query = query.where(
130
+ "(event_registrations.receiptcode LIKE ? OR event_registrations.lastname LIKE ? OR
131
+ event_registrations.firstname LIKE ? OR
132
+ students.lastname LIKE ? OR students.firstname LIKE ? OR
133
+ students.middlename LIKE ? OR students.nickname LIKE ?)",
134
+ wildname, wildname, wildname, wildname, wildname, wildname, wildname)
135
+
136
+ elsif params[:commit] == 'SearchState'
137
+ query = query.where("event_registrations.process_state LIKE ?", params[:name])
138
+ elsif params[:commit] == 'SearchTag'
139
+ query = query.tagged_with(params[:name])
140
+ else
141
+ @show_all = false
142
+ end
143
+ @event_registrations = query.paginate :page => params[:page], :per_page => 100
144
+ else
145
+ flash[:error] = 'Select a workshop to view registrations'
146
+ redirect_to :controller => 'event_workshops', :action => 'list'
147
+ end
148
+ store_location
149
+ end
150
+
151
+ #------------------------------------------------------------------------------
152
+ def clear_confirmed_updated
153
+ @workshop = EventWorkshop.find_by_id(params[:id])
154
+ permit "#{SystemRoles::Moderator} on :workshop or #{SystemRoles::Moderator} on :event or #{SystemRoles::Admin} on Event or #{SystemRoles::System}", :event => @workshop.event
155
+
156
+ @workshop.event_registration.clear_confirmed_updated
157
+ redirect_to :action => 'list', :id => @workshop
158
+ end
159
+
160
+ #------------------------------------------------------------------------------
161
+ def destroy
162
+ event_registration = EventRegistration.find(params[:id])
163
+ @workshop = @event_registration.event_workshop
164
+ permit "#{SystemRoles::Moderator} on :workshop or #{SystemRoles::Moderator} on :event or #{SystemRoles::Admin} on Event or #{SystemRoles::System}", :event => @workshop.event
165
+ event_registration.destroy
166
+ redirect_back_or_default(:action => 'list', :id => event_registration.event_workshop_id)
167
+ end
168
+
169
+ #------------------------------------------------------------------------------
170
+ def markpaid
171
+ event_registration = EventRegistration.find(params[:id])
172
+ event_registration.paid!
173
+ redirect_back_or_default(:action => 'list', :id => event_registration.event_workshop_id)
174
+ rescue ActiveRecord::StaleObjectError
175
+ flash[:error] = 'Changes not saved - registration was modified by someone else'
176
+ redirect_back_or_default(:action => 'list', :id => event_registration.event_workshop_id)
177
+ end
178
+
179
+ #------------------------------------------------------------------------------
180
+ def payment_verification
181
+ event_registration = EventRegistration.find(params[:id])
182
+ event_registration.verify_payment
183
+ redirect_back_or_default(:action => 'list', :id => event_registration.event_workshop_id)
184
+ end
185
+
186
+ # cancel a registration
187
+ #------------------------------------------------------------------------------
188
+ def cancel
189
+ event_registration = EventRegistration.find(params[:id])
190
+ event_registration.canceled!
191
+ redirect_back_or_default(:action => 'list', :id => event_registration.event_workshop_id)
192
+ rescue ActiveRecord::StaleObjectError
193
+ flash[:error] = 'Changes not saved - registration was modified by someone else'
194
+ redirect_back_or_default(:action => 'list', :id => event_registration.event_workshop_id)
195
+ end
196
+
197
+
198
+ # remail the registration receipt
199
+ #------------------------------------------------------------------------------
200
+ def email_receipt
201
+ @event_registration = EventRegistration.find(params[:id])
202
+ email = @event_registration.email_receipt
203
+ unless email == nil
204
+ flash[:notice] = 'Email receipt was sent.'
205
+ else
206
+ flash[:error] = 'Sending of email receipt failed.'
207
+ end
208
+ redirect_back_or_default(:action => 'list', :id => @event_registration.event_workshop_id)
209
+ end
210
+
211
+ # remail the registration receipt to all attending
212
+ #------------------------------------------------------------------------------
213
+ def email_receipt_attending
214
+ success = failed = 0
215
+ workshop = EventWorkshop.find(params[:id])
216
+ workshop.event_registrations_attending.each do |event_registration|
217
+ email = event_registration.email_receipt
218
+ success += 1 if email
219
+ failed += 1 if email.nil?
220
+ end
221
+ flash[:notice] = "Email receipt sent: Successfully: #{success} Failed: #{failed}"
222
+ redirect_back_or_default(:action => :list, :id => workshop.id)
223
+ end
224
+
225
+ #------------------------------------------------------------------------------
226
+ def export_payment
227
+ unless params[:id] == nil
228
+ column_definitions = []
229
+ column_definitions << ["student_id", "item.student.nil? ? '' : item.student.id", 100]
230
+ column_definitions << ["lastname", "item.student.nil? ? item.lastname.capitalize : item.student.lastname.capitalize", 100]
231
+ column_definitions << ["firstname", "item.student.nil? ? item.firstname.capitalize : item.student.firstname.capitalize", 100]
232
+ column_definitions << ["fullname", "item.full_name", 100]
233
+ column_definitions << ["receiptcode", "item.receiptcode", nil, {:type => 'Number'}]
234
+ column_definitions << ["payamount", "item.event_payment.amount", nil, {:type => 'Number', :numberformat => '#,##0.00'}]
235
+ column_definitions << ["paytype", "item.event_payment.payment_type"]
236
+ column_definitions << ["paydesc", "item.event_payment.payment_desc"]
237
+ column_definitions << ["balance_owed", "item.balance_owed / 100"]
238
+ column_definitions << ["discount", "item.discount_cents / 100"]
239
+ column_definitions << ["item_code", "item.item_code"]
240
+ column_definitions << ["payment_comment", "item.payment_comment"]
241
+ column_definitions << ["receipt_requested", "item.receipt_requested"]
242
+
243
+ workshop = EventWorkshop.find(params[:id])
244
+ data_export(column_definitions, workshop.event_registrations_attending, :filename => "Payments #{workshop.title}", :expressions => true, :format => params[:format])
245
+ end
246
+ end
247
+
248
+ #------------------------------------------------------------------------------
249
+ def export_customers
250
+ raise "Export Customer List" unless permit? SystemRoles::KitchenSink
251
+ unless params[:id] == nil
252
+ column_definitions = []
253
+ column_definitions << ["Code", "item.student.nil? ? '' : ('H' + item.student.id.to_s)"]
254
+ column_definitions << ["Name", "item.full_name", 100]
255
+ column_definitions << ["eMail", "item.student.nil? ? item.email.downcase : item.student.email.downcase", 150]
256
+ column_definitions << ["Address1", "item.student.nil? ? item.address : item.student.address", 150]
257
+ column_definitions << ["Address2", "item.student.nil? ? item.address2 : item.student.address2"]
258
+ column_definitions << ["Address3", "item.student.nil? ? item.city.capitalize : item.student.city.capitalize", 100]
259
+ column_definitions << ["State", "item.student.nil? ? item.state.capitalize : item.student.state.capitalize"]
260
+ column_definitions << ["PostCdoe", "item.student.nil? ? item.zipcode : item.student.zipcode"]
261
+ column_definitions << ["AddressCountry", "item.student.nil? ? item.country.code : item.student.country.code"]
262
+ column_definitions << ["Phone", "item.student.nil? ? item.phone : item.student.phone", 100]
263
+ column_definitions << ['Mobile', 'item.student.nil? ? item.cell : item.student.cell', 100]
264
+ column_definitions << ['CustomerType', '2']
265
+
266
+
267
+ workshop = EventWorkshop.find(params[:id])
268
+ data_export(column_definitions, workshop.event_registrations_attending, :filename => "Customers #{workshop.title}", :expressions => true, :format => params[:format])
269
+ end
270
+ end
271
+
272
+ #------------------------------------------------------------------------------
273
+ def ajax_quick_update
274
+ @event_registration = EventRegistration.find(params[:id])
275
+ end
276
+
277
+ #------------------------------------------------------------------------------
278
+ def ajax_save_update
279
+ @event_registration = EventRegistration.find(params[:id])
280
+ if @event_registration.update_attributes(params[:event_registration])
281
+ render :action => :ajax_save_update
282
+ end
283
+ end
284
+
285
+ #------------------------------------------------------------------------------
286
+ def ajax_cancel_update
287
+ render :action => :ajax_cancel_update
288
+ end
289
+
290
+ #------------------------------------------------------------------------------
291
+ def ajax_checkin
292
+ @event_registration = EventRegistration.find(params[:id])
293
+ end
294
+
295
+ #------------------------------------------------------------------------------
296
+ def ajax_save_checkin
297
+ @event_registration = EventRegistration.find(params[:id])
298
+ params[:event_registration] ||= {} # TODO this is a hack, if the payment level is not specified
299
+ if params[:commit_value] == 'checkin'
300
+ @event_registration.arrival_at = DateTime.new(params[:event_registration]["arrival_at(1i)"].to_i, params[:event_registration]["arrival_at(2i)"].to_i, params[:event_registration]["arrival_at(3i)"].to_i) unless !@event_registration.event_workshop.show_arrival_departure or params[:event_registration]["arrival_at(1i)"].blank?
301
+ @event_registration.departure_at = DateTime.new(params[:event_registration]["departure_at(1i)"].to_i, params[:event_registration]["departure_at(2i)"].to_i, params[:event_registration]["departure_at(3i)"].to_i) unless !@event_registration.event_workshop.show_arrival_departure or params[:event_registration]["departure_at(1i)"].blank?
302
+ @event_registration.checkin_at = Time.new
303
+ @success = @event_registration.save(:validate => false)
304
+ @event_registration.student.update_attribute(:localcell, params[:localcell]) if @event_registration.student and params[:localcell]
305
+ elsif params[:commit_value] == 'checkout'
306
+ @event_registration.arrival_at = DateTime.new(params[:event_registration]["arrival_at(1i)"].to_i, params[:event_registration]["arrival_at(2i)"].to_i, params[:event_registration]["arrival_at(3i)"].to_i) unless !@event_registration.event_workshop.show_arrival_departure or params[:event_registration]["arrival_at(1i)"].blank?
307
+ @event_registration.departure_at = DateTime.new(params[:event_registration]["departure_at(1i)"].to_i, params[:event_registration]["departure_at(2i)"].to_i, params[:event_registration]["departure_at(3i)"].to_i) unless !@event_registration.event_workshop.show_arrival_departure or params[:event_registration]["departure_at(1i)"].blank?
308
+ @event_registration.checkin_at = nil
309
+ @success = @event_registration.save(:validate => false)
310
+ elsif params[:commit_value] == 'confirm_dates'
311
+ @event_registration.arrival_at = DateTime.new(params[:event_registration]["arrival_at(1i)"].to_i, params[:event_registration]["arrival_at(2i)"].to_i, params[:event_registration]["arrival_at(3i)"].to_i) unless !@event_registration.event_workshop.show_arrival_departure or params[:event_registration]["arrival_at(1i)"].blank?
312
+ @event_registration.departure_at = DateTime.new(params[:event_registration]["departure_at(1i)"].to_i, params[:event_registration]["departure_at(2i)"].to_i, params[:event_registration]["departure_at(3i)"].to_i) unless !@event_registration.event_workshop.show_arrival_departure or params[:event_registration]["departure_at(1i)"].blank?
313
+ #@event_registration.user_updated_at = Time.new
314
+ #@event_registration.room_id = params[:event_registration][:room_id] if @event_registration.event_workshop.show_rooming
315
+ @success = @event_registration.save(:validate => false)
316
+ @event_registration.student.update_attribute(:localcell, params[:localcell]) if @event_registration.student and params[:localcell]
317
+ elsif params[:commit_value] == 'payment_information'
318
+ @event_registration.attributes = params[:event_registration]
319
+ @success = @event_registration.save(:validate => false)
320
+ if @success
321
+ @event_registration.update_attribute(:item_code, @event_registration.event_payment.shoppingcart_code) unless (@event_registration.event_payment.nil? || @event_registration.event_payment.shoppingcart_code.blank?)
322
+ end
323
+ else
324
+ @event_registration.send('paid!')
325
+ @success = true
326
+ end
327
+ end
328
+
329
+ #------------------------------------------------------------------------------
330
+ def ajax_tag_text
331
+ @event_registration = EventRegistration.find(params[:id])
332
+ render :text => (@event_registration.tag_list_on(params[:tag_context]).blank? ? " " : @event_registration.tag_list_on(params[:tag_context]))
333
+ end
334
+
335
+ #------------------------------------------------------------------------------
336
+ def ajax_set_tag_text
337
+ @event_registration = EventRegistration.find(params[:id])
338
+ @event_registration.set_tag_list_on(params[:tag_context], params[:value])
339
+ @event_registration.save(:validate => false)
340
+ @event_registration.reload
341
+ render :partial => "hanuman/shared/tag_text", :object => @event_registration.tags_on(params[:tag_context])
342
+ end
343
+
344
+
345
+ #------------------------------------------------------------------------------
346
+ def ajax_tag_text_public
347
+ @event_registration = EventRegistration.find(params[:id])
348
+ render :text => (@event_registration.tag_list_public.blank? ? " " : @event_registration.tag_list_public)
349
+ end
350
+
351
+ #------------------------------------------------------------------------------
352
+ def ajax_set_tag_text_public
353
+ @event_registration = EventRegistration.find(params[:id])
354
+ @event_registration.tag_public_with(params[:value])
355
+ @event_registration.reload
356
+ render :partial => "hanuman/shared/tag_text", :object => @event_registration.tags_public, :locals => {:caption => 'add public tag'}
357
+ end
358
+
359
+ # [todo]
360
+ #------------------------------------------------------------------------------
361
+ def edit_campaign
362
+ @campaign = params[:id] ? EmailCampaign.find(params[:id]) : EmailCampaign.new
363
+ @workshop = @campaign.new_record? ? EventWorkshop.find(params[:workshop_id]) : @campaign.campaignable
364
+
365
+ if put_or_post?
366
+ @campaign.attributes = params[:campaign]
367
+ @campaign.html = TemplateLiquid.new(:template => File.read("#{Rails.root}/site_assets/email_templates/template_html.liquid"))
368
+ @campaign.html = "<html><body>#{help.markdown(@campaign.plaintext, :safe => false)}</body></html>"
369
+ if @campaign.save
370
+ @campaign.campaignable = @workshop and @campaign.save if @campaign.campaignable.nil?
371
+ redirect_to :controller => :event_registrations, :action => 'list', :id => @workshop
372
+ return
373
+ end
374
+ end
375
+ end
376
+
377
+ # [todo]
378
+ #------------------------------------------------------------------------------
379
+ def send_campaign
380
+ @campaign = EmailCampaign.find(params[:id])
381
+ @workshop = @campaign.campaignable
382
+
383
+ @workshop.event_registration.each do |registration|
384
+ if registration.attending?
385
+ values = {'event' => registration.to_liquid}
386
+ @campaign.add_email(registration.student.nil? ? registration.email : registration.student.email, :substitutions => values)
387
+ end
388
+ end
389
+ @campaign.start_sending
390
+
391
+ flash[:notice] = "#{@workshop.event_registration.size} emails are now queued for sending"
392
+ redirect_to :action => :edit_campaign, :id => @campaign
393
+ end
394
+
395
+ #------------------------------------------------------------------------------
396
+ def preview_campaign
397
+ show_preview_email(params[:campaign][:subject], '', params[:campaign][:plaintext])
398
+ end
399
+
400
+ #------------------------------------------------------------------------------
401
+ def show_preview_email(subject, html, plain)
402
+ render :action => :show_preview_email
403
+ end
404
+
405
+ #------------------------------------------------------------------------------
406
+ def preview_email
407
+ @subject, @html, @plain = params[:subject], params[:html], params[:plain]
408
+ render :layout => false
409
+ end
410
+ =end
411
+ end