dm_event 4.2.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +23 -0
- data/README.md +33 -0
- data/Rakefile +36 -0
- data/app/assets/images/dm_event/payment_logos/sofort/at/100x38.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/at/200x75.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/at/250x94.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/at/28x7.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/at/320x120.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/at/42x11.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/at/75x28.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/at/icon-32x22.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/at/icon-32x24.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/at/icon-48x32.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/at/icon-48x34.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/at/icon-64x42.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/at/icon-64x44.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/be/100x38.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/be/200x75.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/be/250x94.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/be/28x7.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/be/320x120.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/be/42x11.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/be/75x28.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/be/icon-32x22.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/be/icon-32x24.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/be/icon-48x32.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/be/icon-48x34.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/be/icon-64x42.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/be/icon-64x44.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/ch/100x38.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/ch/200x75.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/ch/250x94.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/ch/28x7.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/ch/320x120.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/ch/42x11.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/ch/75x28.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-32x22.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-32x24.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-48x32.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-48x34.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-64x42.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/ch/icon-64x44.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/de/100x38.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/de/200x75.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/de/250x94.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/de/28x7.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/de/320x120.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/de/42x11.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/de/75x28.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/de/icon-32x22.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/de/icon-32x24.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/de/icon-48x32.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/de/icon-48x34.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/de/icon-64x42.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/de/icon-64x44.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/es/100x38.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/es/200x75.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/es/250x94.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/es/28x7.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/es/320x120.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/es/42x11.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/es/75x28.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/es/icon-32x22.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/es/icon-32x24.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/es/icon-48x32.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/es/icon-48x34.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/es/icon-64x42.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/es/icon-64x44.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/fr/100x38.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/fr/200x75.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/fr/250x94.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/fr/28x7.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/fr/320x120.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/fr/42x11.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/fr/75x28.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-32x22.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-32x24.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-48x32.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-48x34.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-64x42.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/fr/icon-64x44.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/it/100x38.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/it/200x75.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/it/250x94.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/it/28x7.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/it/320x120.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/it/42x11.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/it/75x28.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/it/icon-32x22.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/it/icon-32x24.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/it/icon-48x32.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/it/icon-48x34.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/it/icon-64x42.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/it/icon-64x44.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/nl/100x38.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/nl/200x75.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/nl/250x94.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/nl/28x7.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/nl/320x120.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/nl/42x11.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/nl/75x28.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-32x22.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-32x24.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-48x32.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-48x34.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-64x42.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/nl/icon-64x44.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/pl/100x38.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/pl/200x75.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/pl/250x94.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/pl/28x7.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/pl/320x120.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/pl/42x11.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/pl/75x28.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-32x22.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-32x24.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-48x32.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-48x34.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-64x42.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/pl/icon-64x44.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/uk/100x38.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/uk/200x75.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/uk/250x94.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/uk/28x7.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/uk/320x120.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/uk/42x11.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/uk/75x28.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-32x22.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-32x24.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-48x32.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-48x34.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-64x42.png +0 -0
- data/app/assets/images/dm_event/payment_logos/sofort/uk/icon-64x44.png +0 -0
- data/app/assets/javascripts/dm_event/admin.js +94 -0
- data/app/assets/stylesheets/dm_event/admin.css +152 -0
- data/app/assets/stylesheets/dm_event/application.css +65 -0
- data/app/controllers/dm_event/admin/admin_controller.rb +13 -0
- data/app/controllers/dm_event/admin/registrations_controller.rb +411 -0
- data/app/controllers/dm_event/admin/workshop_prices_controller.rb +73 -0
- data/app/controllers/dm_event/admin/workshops_controller.rb +147 -0
- data/app/controllers/dm_event/application_controller.rb +23 -0
- data/app/controllers/dm_event/payments_controller.rb +83 -0
- data/app/controllers/dm_event/registrations_controller.rb +368 -0
- data/app/datatables/registration_datatable.rb +117 -0
- data/app/helpers/dm_event/application_helper.rb +4 -0
- data/app/helpers/dm_event/registrations_helper.rb +14 -0
- data/app/helpers/dm_event/workshops_helper.rb +41 -0
- data/app/mailers/payment_reminder_mailer.rb +25 -0
- data/app/mailers/registration_notify_mailer.rb +31 -0
- data/app/models/dm_event/concerns/ability.rb +38 -0
- data/app/models/dm_event/concerns/registration_state_email.rb +80 -0
- data/app/models/dm_event/concerns/registration_state_machine.rb +218 -0
- data/app/models/dm_event/concerns/user_profile.rb +20 -0
- data/app/models/dm_event/model_decorators.rb +6 -0
- data/app/models/dm_event/permitted_params.rb +35 -0
- data/app/models/payment.rb +48 -0
- data/app/models/registration.rb +297 -0
- data/app/models/workshop.rb +247 -0
- data/app/models/workshop_price.rb +118 -0
- data/app/presenters/event_common_presenter.rb +31 -0
- data/app/presenters/registration_presenter.rb +34 -0
- data/app/presenters/workshop_presenter.rb +22 -0
- data/app/views/dm_event/admin/registrations/_form.html.erb +297 -0
- data/app/views/dm_event/admin/registrations/action_state.js.erb +1 -0
- data/app/views/dm_event/admin/registrations/edit.html.erb +1 -0
- data/app/views/dm_event/admin/registrations/index.html.erb +0 -0
- data/app/views/dm_event/admin/workshop_prices/_form.html.erb +62 -0
- data/app/views/dm_event/admin/workshop_prices/edit.html.erb +2 -0
- data/app/views/dm_event/admin/workshop_prices/index.html.erb +31 -0
- data/app/views/dm_event/admin/workshop_prices/new.html.erb +2 -0
- data/app/views/dm_event/admin/workshops/_form.html.erb +61 -0
- data/app/views/dm_event/admin/workshops/_header_menu.html.erb +21 -0
- data/app/views/dm_event/admin/workshops/_registration_stats.html.erb +58 -0
- data/app/views/dm_event/admin/workshops/additional_configuration.html.erb +47 -0
- data/app/views/dm_event/admin/workshops/edit.html.erb +2 -0
- data/app/views/dm_event/admin/workshops/edit_system_email.html.erb +75 -0
- data/app/views/dm_event/admin/workshops/financials.html.erb +179 -0
- data/app/views/dm_event/admin/workshops/index.html.erb +100 -0
- data/app/views/dm_event/admin/workshops/lost_users.html.erb +44 -0
- data/app/views/dm_event/admin/workshops/new.html.erb +2 -0
- data/app/views/dm_event/admin/workshops/show.html.erb +47 -0
- data/app/views/dm_event/admin/workshops/user_outstanding_balances.html.erb +29 -0
- data/app/views/dm_event/liquid_tags/_funding_project_status.html.erb +27 -0
- data/app/views/dm_event/payments/_registrations_paypal_standard.html.erb +23 -0
- data/app/views/dm_event/payments/_registrations_sofort.html.erb +18 -0
- data/app/views/dm_event/registrations/_section_address.html.erb +30 -0
- data/app/views/dm_event/registrations/_section_custom_fields.html.erb +7 -0
- data/app/views/dm_event/registrations/_section_prices.html.erb +33 -0
- data/app/views/dm_event/registrations/_workshop_price.html.erb +18 -0
- data/app/views/dm_event/registrations/choose_payment.html.erb +5 -0
- data/app/views/dm_event/registrations/closed.html.erb +14 -0
- data/app/views/dm_event/registrations/new.html.erb +30 -0
- data/app/views/dm_event/registrations/success.html.erb +15 -0
- data/app/views/layouts/email_templates/dm_event_email_layout.html.erb +318 -0
- data/app/views/layouts/email_templates/dm_event_email_layout.text.erb +1 -0
- data/app/views/layouts/email_templates/dm_event_payment_reminder.html.erb +22 -0
- data/app/views/layouts/email_templates/dm_event_payment_reminder.text.erb +19 -0
- data/app/views/layouts/email_templates/dm_event_registration_notify.html.erb +21 -0
- data/app/views/layouts/email_templates/dm_event_registration_notify.text.erb +13 -0
- data/config/initializers/dm_event.rb +1 -0
- data/config/initializers/liquid_init.rb +2 -0
- data/config/locales/ems.cs.yml +51 -0
- data/config/locales/ems.de.yml +51 -0
- data/config/locales/ems.en.yml +51 -0
- data/config/locales/ems.fi.yml +51 -0
- data/config/locales/ems.ja.yml +51 -0
- data/config/routes.rb +40 -0
- data/db/migrate/20130510155617_create_events.rb +98 -0
- data/db/migrate/20130516124327_add_locale_to_registration.rb +5 -0
- data/db/migrate/20130516204454_add_user_profile_to_registration.rb +11 -0
- data/db/migrate/20130518092324_add_require_address.rb +7 -0
- data/db/migrate/20130609145812_add_workshop_published.rb +5 -0
- data/db/migrate/20130624134506_add_amount_currency.rb +16 -0
- data/db/migrate/20130703131515_add_workshop_currency.rb +5 -0
- data/db/migrate/20130913083529_add_event_funding_type.rb +6 -0
- data/db/migrate/20130914105736_add_enable_payments.rb +5 -0
- data/db/migrate/20130916160033_add_sidebar_to_workshop.rb +5 -0
- data/db/migrate/20130917161700_add_show_address.rb +5 -0
- data/db/migrate/20131116180719_add_default_funding_goal.rb +8 -0
- data/db/migrate/20131127165445_add_payment_reminder.rb +5 -0
- data/db/migrate/20140122204702_add_event_image.rb +5 -0
- data/db/migrate/20140523165342_add_workshop_summary.rb +5 -0
- data/db/migrate/20140605052208_add_uuid_to_registration.rb +10 -0
- data/db/migrate/20140707152124_add_registration_comment_count.rb +5 -0
- data/db/migrate/20140708142312_add_payment_comment.rb +20 -0
- data/db/migrate/20150709125105_add_payment_reminder_history.rb +16 -0
- data/db/migrate/20160810081542_add_bcc_contact_email.rb +5 -0
- data/db/migrate/20160821150120_index_foreign_keys_in_ems_registrations.rb +9 -0
- data/db/migrate/20160821150121_index_foreign_keys_in_ems_workshop_price_translations.rb +5 -0
- data/db/migrate/20160821150122_index_foreign_keys_in_ems_workshop_prices.rb +6 -0
- data/db/migrate/20160821150123_index_foreign_keys_in_ems_workshop_translations.rb +5 -0
- data/db/migrate/20160821150124_index_foreign_keys_in_ems_workshops.rb +6 -0
- data/lib/dm_event/engine.rb +20 -0
- data/lib/dm_event/liquid/tags/funding_project_status.rb +55 -0
- data/lib/dm_event.rb +4 -0
- data/lib/tasks/dm_event_tasks.rake +4 -0
- data/spec/controllers/registrations_controller_spec.rb +152 -0
- data/spec/dummy/README.rdoc +28 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +13 -0
- data/spec/dummy/app/assets/stylesheets/application.css +15 -0
- data/spec/dummy/app/controllers/application_controller.rb +5 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/models/ability.rb +10 -0
- data/spec/dummy/app/models/user.rb +6 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/bin/bundle +3 -0
- data/spec/dummy/bin/rails +4 -0
- data/spec/dummy/bin/rake +4 -0
- data/spec/dummy/config/application.rb +26 -0
- data/spec/dummy/config/boot.rb +5 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +82 -0
- data/spec/dummy/config/environments/test.rb +39 -0
- data/spec/dummy/config/initializers/assets.rb +8 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/dummy/config/initializers/inflections.rb +16 -0
- data/spec/dummy/config/initializers/mime_types.rb +4 -0
- data/spec/dummy/config/initializers/session_store.rb +3 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +23 -0
- data/spec/dummy/config/routes.rb +11 -0
- data/spec/dummy/config/secrets.yml +22 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/development.sqlite3 +0 -0
- data/spec/dummy/db/migrate/20141114170927_add_globalize_countries.dm_core.rb +50 -0
- data/spec/dummy/db/migrate/20141114170928_devise_create_users.dm_core.rb +46 -0
- data/spec/dummy/db/migrate/20141114170929_add_user_fields.dm_core.rb +14 -0
- data/spec/dummy/db/migrate/20141114170930_rolify_create_roles.dm_core.rb +20 -0
- data/spec/dummy/db/migrate/20141114170931_add_last_access.dm_core.rb +10 -0
- data/spec/dummy/db/migrate/20141114170932_create_versions.dm_core.rb +19 -0
- data/spec/dummy/db/migrate/20141114170933_add_object_changes_column_to_versions.dm_core.rb +12 -0
- data/spec/dummy/db/migrate/20141114170934_create_dm_core_accounts.dm_core.rb +13 -0
- data/spec/dummy/db/migrate/20141114170935_add_account_to_users.dm_core.rb +9 -0
- data/spec/dummy/db/migrate/20141114170936_create_preferences.dm_core.rb +13 -0
- data/spec/dummy/db/migrate/20141114170937_create_comments.dm_core.rb +22 -0
- data/spec/dummy/db/migrate/20141114170938_add_activity.dm_core.rb +21 -0
- data/spec/dummy/db/migrate/20141114170939_add_type_to_comments.dm_core.rb +9 -0
- data/spec/dummy/db/migrate/20141114170940_add_category.dm_core.rb +28 -0
- data/spec/dummy/db/migrate/20141114170941_create_email_table.dm_core.rb +26 -0
- data/spec/dummy/db/migrate/20141114170942_add_user_profile.dm_core.rb +46 -0
- data/spec/dummy/db/migrate/20141114170943_add_profile_email.dm_core.rb +14 -0
- data/spec/dummy/db/migrate/20141114170944_create_payment_history.dm_core.rb +37 -0
- data/spec/dummy/db/migrate/20141114170945_change_anchor_field.dm_core.rb +10 -0
- data/spec/dummy/db/migrate/20141114170946_create_user_site_profile.dm_core.rb +27 -0
- data/spec/dummy/db/migrate/20141114170947_add_avatar.dm_core.rb +12 -0
- data/spec/dummy/db/migrate/20141114170948_add_notify_to_payment_history.dm_core.rb +8 -0
- data/spec/dummy/db/migrate/20141114170949_acts_as_votable_migration.dm_core.rb +28 -0
- data/spec/dummy/db/migrate/20141114170950_add_user_site_profile_uuid.dm_core.rb +19 -0
- data/spec/dummy/db/migrate/20141114170951_add_invoice_id.dm_core.rb +7 -0
- data/spec/dummy/db/migrate/20141114170952_acts_as_follower_migration.dm_core.rb +18 -0
- data/spec/dummy/db/migrate/20141114170953_rename_invoice_id.dm_core.rb +12 -0
- data/spec/dummy/db/migrate/20141114170954_add_core_addresses.dm_core.rb +18 -0
- data/spec/dummy/db/migrate/20141114170955_papertrail_increase_column.dm_core.rb +9 -0
- data/spec/dummy/db/migrate/20141114170956_acts_as_taggable_on_migration.dm_core.rb +32 -0
- data/spec/dummy/db/migrate/20141114170957_add_missing_unique_indices.dm_core.rb +23 -0
- data/spec/dummy/db/migrate/20141114170958_add_taggings_counter_cache_to_tags.dm_core.rb +16 -0
- data/spec/dummy/db/migrate/20141114170959_create_custom_fields.dm_core.rb +40 -0
- data/spec/dummy/db/migrate/20141114170960_add_missing_taggable_index.dm_core.rb +11 -0
- data/spec/dummy/db/migrate/20141119103740_create_cms.dm_cms.rb +92 -0
- data/spec/dummy/db/migrate/20141119103741_add_account_to_cms.dm_cms.rb +11 -0
- data/spec/dummy/db/migrate/20141119103742_create_blog.dm_cms.rb +62 -0
- data/spec/dummy/db/migrate/20141119103743_add_notification_sent.dm_cms.rb +6 -0
- data/spec/dummy/db/migrate/20141119103744_add_blog_comment.dm_cms.rb +8 -0
- data/spec/dummy/db/migrate/20141119103745_add_blog_image.dm_cms.rb +6 -0
- data/spec/dummy/db/migrate/20141119103746_rename_snippet_slug.dm_cms.rb +14 -0
- data/spec/dummy/db/migrate/20141119103747_add_requires_subscription_blog.dm_cms.rb +8 -0
- data/spec/dummy/db/migrate/20141119103748_add_pages_ranked_model.dm_cms.rb +23 -0
- data/spec/dummy/db/migrate/20141119103749_add_blog_owner.dm_cms.rb +7 -0
- data/spec/dummy/db/migrate/20141119103750_create_media_files.dm_cms.rb +30 -0
- data/spec/dummy/db/migrate/20141119103751_add_cmspage_summary.dm_cms.rb +7 -0
- data/spec/dummy/db/migrate/20141119103752_add_blog_image_email_header.dm_cms.rb +6 -0
- data/spec/dummy/db/migrate/20141119103753_add_header_image.dm_cms.rb +10 -0
- data/spec/dummy/db/migrate/20160128154135_add_favored_locale.dm_core.rb +17 -0
- data/spec/dummy/db/migrate/20160128154136_update_papertrail_v4.dm_core.rb +41 -0
- data/spec/dummy/db/schema.rb +677 -0
- data/spec/dummy/public/404.html +67 -0
- data/spec/dummy/public/422.html +67 -0
- data/spec/dummy/public/500.html +66 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/factories/account_factory.rb +7 -0
- data/spec/factories/registration_factory.rb +13 -0
- data/spec/factories/workshop_factory.rb +25 -0
- data/spec/factories/workshop_price_factory.rb +19 -0
- data/spec/models/registration_spec.rb +83 -0
- data/spec/models/workshop_spec.rb +26 -0
- data/spec/rails_helper.rb +70 -0
- data/spec/spec_helper.rb +85 -0
- data/spec/support/accounts.rb +17 -0
- data/spec/support/devise.rb +44 -0
- data/spec/support/fix_locale.rb +57 -0
- 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,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" —
|
9
|
+
meaning they actually have a seat reserved — 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,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> </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> </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 %>
|