diff --git a/Gemfile b/Gemfile index c24d96b7..4228e224 100644 --- a/Gemfile +++ b/Gemfile @@ -1,7 +1,7 @@ source 'https://rubygems.org' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails' -gem 'rails', '~> 4.0' +gem 'rails', '~> 4.2' # We <3 New Relic gem 'newrelic_rpm' @@ -39,6 +39,9 @@ gem 'simple_form' # Datagrid is nice gem 'datagrid' +# Wicked gem +gem 'wicked' + group :doc do # bundle exec rake doc:rails generates the API under doc/api. gem 'sdoc', require: false @@ -60,8 +63,8 @@ gem 'devise_cas_authenticatable' # Token authentication for partners gem 'simple_token_authentication' -# CanCan is used for authorization -gem 'cancan' +# CanCanCan is used for authorization +gem 'cancancan', '~> 1.9' gem 'httparty' # Logging is awesome, and paper_trail even more @@ -93,7 +96,7 @@ gem 'spreadsheet' # Run stuff in the background gem 'daemons' -gem 'delayed_job', '~> 4.0' +gem 'delayed_job', '~> 4.0.6' gem 'delayed_job_active_record' # diff --git a/Gemfile.lock b/Gemfile.lock index 0482627a..c0888c56 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -9,100 +9,112 @@ GIT GEM remote: https://rubygems.org/ specs: - actionmailer (4.1.5) - actionpack (= 4.1.5) - actionview (= 4.1.5) - mail (~> 2.5.4) - actionpack (4.1.5) - actionview (= 4.1.5) - activesupport (= 4.1.5) - rack (~> 1.5.2) + actionmailer (4.2.0) + actionpack (= 4.2.0) + actionview (= 4.2.0) + activejob (= 4.2.0) + mail (~> 2.5, >= 2.5.4) + rails-dom-testing (~> 1.0, >= 1.0.5) + actionpack (4.2.0) + actionview (= 4.2.0) + activesupport (= 4.2.0) + rack (~> 1.6.0) rack-test (~> 0.6.2) - actionview (4.1.5) - activesupport (= 4.1.5) + rails-dom-testing (~> 1.0, >= 1.0.5) + rails-html-sanitizer (~> 1.0, >= 1.0.1) + actionview (4.2.0) + activesupport (= 4.2.0) builder (~> 3.1) erubis (~> 2.7.0) - activemodel (4.1.5) - activesupport (= 4.1.5) + rails-dom-testing (~> 1.0, >= 1.0.5) + rails-html-sanitizer (~> 1.0, >= 1.0.1) + activejob (4.2.0) + activesupport (= 4.2.0) + globalid (>= 0.3.0) + activemodel (4.2.0) + activesupport (= 4.2.0) builder (~> 3.1) - activerecord (4.1.5) - activemodel (= 4.1.5) - activesupport (= 4.1.5) - arel (~> 5.0.0) - activesupport (4.1.5) - i18n (~> 0.6, >= 0.6.9) + activerecord (4.2.0) + activemodel (= 4.2.0) + activesupport (= 4.2.0) + arel (~> 6.0) + activesupport (4.2.0) + i18n (~> 0.7) json (~> 1.7, >= 1.7.7) minitest (~> 5.1) - thread_safe (~> 0.1) + thread_safe (~> 0.3, >= 0.3.4) tzinfo (~> 1.1) - addressable (2.3.6) - airbrake (4.0.0) + addressable (2.3.7) + airbrake (4.1.0) builder multi_json annotate (2.6.5) activerecord (>= 2.3.0) rake (>= 0.8.7) - arel (5.0.1.20140414130214) - bcrypt (3.1.7) + arel (6.0.0) + bcrypt (3.1.10) builder (3.2.2) - cancan (1.6.10) - capistrano (3.2.1) + cancancan (1.10.1) + capistrano (3.3.5) + capistrano-stats (~> 1.1.0) i18n rake (>= 10.0.0) sshkit (~> 1.3) - capistrano-bundler (1.1.3) + capistrano-bundler (1.1.4) capistrano (~> 3.1) sshkit (~> 1.2) capistrano-rails (1.1.2) capistrano (~> 3.1) capistrano-bundler (~> 1.1) - capistrano-rvm (0.1.1) + capistrano-rvm (0.1.2) capistrano (~> 3.0) sshkit (~> 1.2) - capybara (2.4.1) + capistrano-stats (1.1.1) + capybara (2.4.4) mime-types (>= 1.16) nokogiri (>= 1.3.3) rack (>= 1.0.0) rack-test (>= 0.5.4) xpath (~> 2.0) chartkick (1.3.2) - choice (0.1.6) + choice (0.1.7) chronic (0.10.2) - ckeditor_rails (4.4.3) + ckeditor_rails (4.4.6) railties (>= 3.0) climate_control (0.0.3) activesupport (>= 3.0) cliver (0.3.2) - cocaine (0.5.4) + cocaine (0.5.5) climate_control (>= 0.0.3, < 1.0) - coffee-rails (4.0.1) + coffee-rails (4.1.0) coffee-script (>= 2.2.0) railties (>= 4.0.0, < 5.0) coffee-script (2.3.0) coffee-script-source execjs - coffee-script-source (1.8.0) - colorize (0.7.3) - coveralls (0.7.1) - multi_json (~> 1.3) - rest-client - simplecov (>= 0.7) - term-ansicolor - thor + coffee-script-source (1.9.0) + colorize (0.7.5) + coveralls (0.7.9) + multi_json (~> 1.10) + rest-client (~> 1.7) + simplecov (~> 0.9.1) + term-ansicolor (~> 1.3) + thor (~> 0.19.1) crack (0.4.2) safe_yaml (~> 1.0.0) daemons (1.1.9) - datagrid (1.3.1) + datagrid (1.3.6) rails (>= 3.0) - delayed_job (4.0.2) - activesupport (>= 3.0, < 4.2) - delayed_job_active_record (4.0.2) - activerecord (>= 3.0, < 4.2) + delayed_job (4.0.6) + activesupport (>= 3.0, < 5.0) + delayed_job_active_record (4.0.3) + activerecord (>= 3.0, < 5.0) delayed_job (>= 3.0, < 4.1) - devise (3.2.4) + devise (3.4.1) bcrypt (~> 3.0) orm_adapter (~> 0.1) railties (>= 3.2.6, < 5) + responders thread_safe (~> 0.1) warden (~> 1.2.3) devise_cas_authenticatable (1.3.7) @@ -110,132 +122,145 @@ GEM rubycas-client (>= 2.2.1) docile (1.1.5) erubis (2.7.0) - execjs (2.2.1) + execjs (2.3.0) + globalid (0.3.2) + activesupport (>= 4.1.0) hike (1.2.3) - httparty (0.13.1) + httparty (0.13.3) json (~> 1.8) multi_xml (>= 0.5.2) - i18n (0.6.11) - iban-tools (0.0.9) + i18n (0.7.0) + iban-tools (1.0.0) jbuilder (1.5.3) activesupport (>= 3.0.0) multi_json (>= 1.2.0) - jquery-rails (3.1.2) - railties (>= 3.0, < 5.0) + jquery-rails (4.0.3) + rails-dom-testing (~> 1.0) + railties (>= 4.2.0) thor (>= 0.14, < 2.0) - json (1.8.1) - libv8 (3.16.14.3) - mail (2.5.4) - mime-types (~> 1.16) - treetop (~> 1.4.8) - mime-types (1.25.1) - mini_portile (0.6.0) - minitest (5.4.1) + json (1.8.2) + libv8 (3.16.14.7) + loofah (2.0.1) + nokogiri (>= 1.5.9) + mail (2.6.3) + mime-types (>= 1.16, < 3) + mime-types (2.4.3) + mini_portile (0.6.2) + minitest (5.5.1) multi_json (1.10.1) multi_xml (0.5.5) - mysql2 (0.3.16) + mysql2 (0.3.17) net-scp (1.2.1) net-ssh (>= 2.6.5) - net-ssh (2.9.1) - netrc (0.7.7) - newrelic_rpm (3.9.5.251) - nokogiri (1.6.3.1) - mini_portile (= 0.6.0) + net-ssh (2.9.2) + netrc (0.10.2) + newrelic_rpm (3.9.9.275) + nokogiri (1.6.6.2) + mini_portile (~> 0.6.0) orm_adapter (0.5.0) - paper_trail (3.0.5) + paper_trail (3.0.6) activerecord (>= 3.0, < 5.0) activesupport (>= 3.0, < 5.0) - paperclip (4.2.0) + paperclip (4.2.1) activemodel (>= 3.0.0) activesupport (>= 3.0.0) cocaine (~> 0.5.3) mime-types - pdf-core (0.2.5) - poltergeist (1.5.1) + pdf-core (0.4.0) + poltergeist (1.6.0) capybara (~> 2.1) cliver (~> 0.3.1) multi_json (~> 1.0) websocket-driver (>= 0.2.0) - polyglot (0.3.5) - prawn (1.2.1) - pdf-core (~> 0.2.5) - ttfunk (~> 1.2.0) - puma (2.9.0) + prawn (1.3.0) + pdf-core (~> 0.4.0) + ttfunk (~> 1.4.0) + puma (2.11.0) rack (>= 1.1, < 2.0) - rack (1.5.2) - rack-test (0.6.2) + rack (1.6.0) + rack-test (0.6.3) rack (>= 1.0) - rails (4.1.5) - actionmailer (= 4.1.5) - actionpack (= 4.1.5) - actionview (= 4.1.5) - activemodel (= 4.1.5) - activerecord (= 4.1.5) - activesupport (= 4.1.5) + rails (4.2.0) + actionmailer (= 4.2.0) + actionpack (= 4.2.0) + actionview (= 4.2.0) + activejob (= 4.2.0) + activemodel (= 4.2.0) + activerecord (= 4.2.0) + activesupport (= 4.2.0) bundler (>= 1.3.0, < 2.0) - railties (= 4.1.5) - sprockets-rails (~> 2.0) + railties (= 4.2.0) + sprockets-rails + rails-deprecated_sanitizer (1.0.3) + activesupport (>= 4.2.0.alpha) + rails-dom-testing (1.0.5) + activesupport (>= 4.2.0.beta, < 5.0) + nokogiri (~> 1.6.0) + rails-deprecated_sanitizer (>= 1.0.1) rails-erd (1.1.0) activerecord (>= 3.0) activesupport (>= 3.0) choice (~> 0.1.6) ruby-graphviz (~> 1.0.4) - railties (4.1.5) - actionpack (= 4.1.5) - activesupport (= 4.1.5) + rails-html-sanitizer (1.0.1) + loofah (~> 2.0) + railties (4.2.0) + actionpack (= 4.2.0) + activesupport (= 4.2.0) rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) - rake (10.3.2) - rdoc (4.1.1) - json (~> 1.4) + rake (10.4.2) + rdoc (4.2.0) ref (1.0.5) + responders (2.1.0) + railties (>= 4.2.0, < 5) rest-client (1.7.2) mime-types (>= 1.16, < 3.0) netrc (~> 0.7) ri_cal (0.8.8) - rmagick (2.13.3) + rmagick (2.13.4) ruby-graphviz (1.0.9) - ruby-ole (1.2.11.7) + ruby-ole (1.2.11.8) rubycas-client (2.3.9) activesupport - safe_yaml (1.0.3) + safe_yaml (1.0.4) sass (3.2.19) - sass-rails (4.0.3) + sass-rails (4.0.5) railties (>= 4.0.0, < 5.0) - sass (~> 3.2.0) - sprockets (~> 2.8, <= 2.11.0) + sass (~> 3.2.2) + sprockets (~> 2.8, < 3.0) sprockets-rails (~> 2.0) sdoc (0.4.1) json (~> 1.7, >= 1.7.7) rdoc (~> 4.0) - select2-rails (3.5.9.1) + select2-rails (3.5.9.2) thor (~> 0.14) - simple_form (3.0.2) + simple_form (3.1.0) actionpack (~> 4.0) activemodel (~> 4.0) - simple_token_authentication (1.5.0) + simple_token_authentication (1.7.0) actionmailer (>= 3.2.6, < 5) - activerecord (>= 3.2.6, < 5) - devise (~> 3.2.0) - simplecov (0.9.0) + actionpack (>= 3.2.6, < 5) + devise (~> 3.2) + simplecov (0.9.1) docile (~> 1.1.0) - multi_json + multi_json (~> 1.0) simplecov-html (~> 0.8.0) simplecov-html (0.8.0) - spreadsheet (1.0.0) + spreadsheet (1.0.1) ruby-ole (>= 1.0) - sprockets (2.11.0) + sprockets (2.12.3) hike (~> 1.2) multi_json (~> 1.0) rack (~> 1.0) tilt (~> 1.1, != 1.3.0) - sprockets-rails (2.1.4) + sprockets-rails (2.2.4) actionpack (>= 3.0) activesupport (>= 3.0) - sprockets (~> 2.8) - sqlite3 (1.3.9) - sshkit (1.5.1) - colorize + sprockets (>= 2.8, < 4.0) + sqlite3 (1.3.10) + sshkit (1.6.1) + colorize (>= 0.7.0) net-scp (>= 1.1.2) net-ssh (>= 2.8.0) term-ansicolor (1.3.0) @@ -246,27 +271,27 @@ GEM thor (0.19.1) thread_safe (0.3.4) tilt (1.4.1) - tins (1.3.2) - treetop (1.4.15) - polyglot - polyglot (>= 0.3.1) - ttfunk (1.2.2) - turbolinks (2.3.0) + tins (1.3.4) + ttfunk (1.4.0) + turbolinks (2.5.3) coffee-rails tzinfo (1.2.2) thread_safe (~> 0.1) - uglifier (2.5.3) + uglifier (2.7.0) execjs (>= 0.3.0) json (>= 1.8.0) warden (1.2.3) rack (>= 1.0) - webmock (1.18.0) + webmock (1.20.4) addressable (>= 2.3.6) crack (>= 0.3.2) - websocket-driver (0.3.4) - whenever (0.9.2) - activesupport (>= 2.3.4) + websocket-driver (0.5.1) + websocket-extensions (>= 0.1.0) + websocket-extensions (0.1.1) + whenever (0.9.4) chronic (>= 0.6.3) + wicked (1.1.0) + rails (>= 3.0.7) will_paginate (3.0.7) will_paginate-bootstrap (1.0.1) will_paginate (>= 3.0.3) @@ -280,7 +305,7 @@ DEPENDENCIES airbrake annotate barcodes! - cancan + cancancan (~> 1.9) capistrano (~> 3.1) capistrano-rails (~> 1.1) capistrano-rvm @@ -291,7 +316,7 @@ DEPENDENCIES coveralls daemons datagrid - delayed_job (~> 4.0) + delayed_job (~> 4.0.6) delayed_job_active_record devise devise_cas_authenticatable @@ -305,7 +330,7 @@ DEPENDENCIES paperclip (~> 4.0) poltergeist puma - rails (~> 4.0) + rails (~> 4.2) rails-erd ri_cal sass-rails (~> 4.0) @@ -320,5 +345,6 @@ DEPENDENCIES uglifier (>= 1.3.0) webmock whenever + wicked will_paginate (~> 3.0) will_paginate-bootstrap diff --git a/app/assets/javascripts/included_zones.js.coffee b/app/assets/javascripts/included_zones.js.coffee deleted file mode 100644 index 24f83d18..00000000 --- a/app/assets/javascripts/included_zones.js.coffee +++ /dev/null @@ -1,3 +0,0 @@ -# Place all the behaviors and hooks related to the matching controller here. -# All this logic will automatically be available in application.js. -# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/javascripts/orders.js.coffee b/app/assets/javascripts/orders.js.coffee new file mode 100644 index 00000000..637f9186 --- /dev/null +++ b/app/assets/javascripts/orders.js.coffee @@ -0,0 +1,45 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ + +ready = -> + + # Manual order locking + $('#table-orders').on 'click', '.order-lock', -> + form = $(this).closest('form') + if form.find('.disabling').first().is(':disabled') + form.find('.disabling').prop('disabled', false) + form.find('.glyphicon').removeClass('glyphicon-lock') + form.find('.glyphicon').addClass('glyphicon-floppy-save') + else + form.submit() + + # Using the checkbox to set the paid amount to the price (or zero) + $('#table-orders').on 'change', '.order-box', -> + form = $(this).closest('form') + if $(this).is(':checked') + form.find('.order-paid').val('0.00') + else + form.find('.order-paid').val(form.find('.order-price').val()) + + $("a[data-toggle = 'tooltip']").tooltip({'container': 'body'}) + + $('th.to_pay').attr("width", 175) + + $('.btn-inc').on 'click', -> + input = $(this).parent().parent().find('input').first() + input.val(parseInt(input.val()) + 1) + + $('.btn-dec').on 'click', -> + input = $(this).parent().parent().find('input').first() + if input.val() != '0' + input.val(parseInt(input.val()) - 1) + + $('#order_email').on 'change', -> + $('#order_email_confirmation').val('') + + $('#order_email_confirmation').val($('#order_email').val()) + + +$(document).ready(ready) +$(document).on('page:load', ready) diff --git a/app/assets/javascripts/periods.js.coffee b/app/assets/javascripts/periods.js.coffee deleted file mode 100644 index 40b91eda..00000000 --- a/app/assets/javascripts/periods.js.coffee +++ /dev/null @@ -1,43 +0,0 @@ -# Place all the behaviors and hooks related to the matching controller here. -# All this logic will automatically be available in application.js. -# You can use CoffeeScript in this file: http://coffeescript.org/ - -ready = -> - # Fancy fields - datePickerOptions = { - autoclose: true, - weekStart: 1, - language: 'nl', - startDate: $.format.date(Date(), "yyyy-MM-dd HH:mm") - }; - - dayPickerOptions = { - autoclose: true, - weekStart: 1, - language: 'nl', - startDate: $.format.date(Date(), "yyyy-MM-dd"), - format: 'yyyy-mm-dd' - }; - - $('#period-start').datetimepicker(datePickerOptions); - $('#period-end').datetimepicker(datePickerOptions); - - $('#new_period :checkbox').change -> - if $(this).is(':checked') - $('#period-start').datetimepicker("remove") - $('#period-end').datetimepicker("remove") - $('#period-start').datepicker(dayPickerOptions); - $('#period-end').datepicker(dayPickerOptions); - else - $('#period-start').datepicker("remove") - $('#period-end').datepicker("remove") - $('#period-start').datetimepicker(datePickerOptions); - $('#period-end').datetimepicker(datePickerOptions); - - - # Adds Bootstrap error classes to all faulty fields - $(".field_with_errors").parent().filter(".form-group").addClass("has-error"); - -$(document).ready(ready) -$(document).on('page:load', ready) - diff --git a/app/assets/javascripts/registrations.js.coffee b/app/assets/javascripts/registrations.js.coffee index f932de21..24f83d18 100644 --- a/app/assets/javascripts/registrations.js.coffee +++ b/app/assets/javascripts/registrations.js.coffee @@ -1,43 +1,3 @@ # Place all the behaviors and hooks related to the matching controller here. # All this logic will automatically be available in application.js. # You can use CoffeeScript in this file: http://coffeescript.org/ - -ready = -> - - # Manual registration locking - $('#table-registrations').on 'click', '.registration-lock', -> - form = $(this).closest('form') - if form.find('.disabling').first().is(':disabled') - form.find('.disabling').prop('disabled', false) - form.find('.glyphicon').removeClass('glyphicon-lock') - form.find('.glyphicon').addClass('glyphicon-floppy-save') - else - form.submit() - - # Using the checkbox to set the paid amount to the price (or zero) - $('#table-registrations').on 'change', '.registration-box', -> - form = $(this).closest('form') - if $(this).is(':checked') - form.find('.registration-paid').val('0.00') - else - form.find('.registration-paid').val(form.find('.registration-price').val()) - - $("a[data-toggle = 'tooltip']").tooltip({'container': 'body'}) - - $('th.to_pay').attr("width", 175) - - hideCommentFieldIfNeeded = (value) -> - val = parseInt(value) - if (window.ticketsWithComments && window.ticketsWithComments.indexOf(val) == -1) - $("#registration_comment").parent().hide(); - else - $("#registration_comment").parent().show(); - - $("#registration_access_levels").on 'change', -> - hideCommentFieldIfNeeded($(this).val()) - - hideCommentFieldIfNeeded($("#registration_access_levels").val()) - - -$(document).ready(ready) -$(document).on('page:load', ready) diff --git a/app/assets/javascripts/tickets.js.coffee b/app/assets/javascripts/tickets.js.coffee new file mode 100644 index 00000000..4660b210 --- /dev/null +++ b/app/assets/javascripts/tickets.js.coffee @@ -0,0 +1,21 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://coffeescript.org/ + +ready = -> + + hideCommentFieldIfNeeded = (value) -> + val = parseInt(value) + if (window.ticketsWithComments && window.ticketsWithComments.indexOf(val) == -1) + $("#ticket_comment").parent().hide(); + else + $("#ticket_comment").parent().show(); + + $("#ticket_access_levels").on 'change', -> + hideCommentFieldIfNeeded($(this).val()) + + hideCommentFieldIfNeeded($("#ticket_access_levels").val()) + + +$(document).ready(ready) +$(document).on('page:load', ready) diff --git a/app/assets/javascripts/zones.js.coffee b/app/assets/javascripts/zones.js.coffee deleted file mode 100644 index 24f83d18..00000000 --- a/app/assets/javascripts/zones.js.coffee +++ /dev/null @@ -1,3 +0,0 @@ -# Place all the behaviors and hooks related to the matching controller here. -# All this logic will automatically be available in application.js. -# You can use CoffeeScript in this file: http://coffeescript.org/ diff --git a/app/assets/stylesheets/included_zones.css.scss b/app/assets/stylesheets/included_zones.css.scss deleted file mode 100644 index d9914ffd..00000000 --- a/app/assets/stylesheets/included_zones.css.scss +++ /dev/null @@ -1,3 +0,0 @@ -// Place all the styles related to the IncludedZones controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/orders.css.scss b/app/assets/stylesheets/orders.css.scss new file mode 100644 index 00000000..bb9fcdf5 --- /dev/null +++ b/app/assets/stylesheets/orders.css.scss @@ -0,0 +1,14 @@ +// Place all the styles related to the Orders controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ +#table-orders td { + vertical-align: middle; +} + +.no-margin { + margin: 0px; +} + +.no-padding { + padding: 0px; +} diff --git a/app/assets/stylesheets/registrations.css.scss b/app/assets/stylesheets/registrations.css.scss index 41b182ea..f6e17a22 100644 --- a/app/assets/stylesheets/registrations.css.scss +++ b/app/assets/stylesheets/registrations.css.scss @@ -1,14 +1,3 @@ -// Place all the styles related to the Registrations controller here. +// Place all the styles related to the registrations controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ -#table-registrations td { - vertical-align: middle; -} - -.no-margin { - margin: 0px; -} - -.no-padding { - padding: 0px; -} diff --git a/app/assets/stylesheets/periods.css.scss b/app/assets/stylesheets/tickets.css.scss similarity index 64% rename from app/assets/stylesheets/periods.css.scss rename to app/assets/stylesheets/tickets.css.scss index 027648e1..92b729b4 100644 --- a/app/assets/stylesheets/periods.css.scss +++ b/app/assets/stylesheets/tickets.css.scss @@ -1,3 +1,3 @@ -// Place all the styles related to the Periods controller here. +// Place all the styles related to the Tickets controller here. // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/zones.css.scss b/app/assets/stylesheets/zones.css.scss deleted file mode 100644 index cbad403f..00000000 --- a/app/assets/stylesheets/zones.css.scss +++ /dev/null @@ -1,3 +0,0 @@ -// Place all the styles related to the Zones controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/access_levels_controller.rb b/app/controllers/access_levels_controller.rb index 2822878e..a6af5834 100644 --- a/app/controllers/access_levels_controller.rb +++ b/app/controllers/access_levels_controller.rb @@ -44,7 +44,7 @@ def destroy @event = Event.find params.require(:event_id) authorize! :update, @event access_level = AccessLevel.find params.require(:id) - unless access_level.registrations.any? + unless access_level.tickets.any? # Save the name so we can respond it as we still have to # be able to delete it @id = access_level.id @@ -54,17 +54,6 @@ def destroy end end - def set_zones - @event = Event.find params.require(:event_id) - authorize! :update, @event - access_level = AccessLevel.find params.require(:access_level_id) - zones = params.require(:access_level).require(:zones) - # Features introduced in new versions apparently suck pretty hard - # manually parse the output here from collection_check_boxes, because rails - access_level.set_zones_by_ids zones[0..-2].map { |z| z.split.first.to_i } - redirect_to @event - end - def toggle_visibility @event = Event.find params.require(:event_id) authorize! :update, @event diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index 2cee80c3..664a86fc 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -17,13 +17,6 @@ def index end def show - @registration = @event.registrations.build - - if current_user - @registration.name = current_user.display_name - @registration.student_number = current_user.cas_ugentStudentID - @registration.email = current_user.cas_mail - end end def new @@ -68,9 +61,9 @@ def statistics @event = Event.find params.require(:id) authorize! :view_stats, @event - if not @event.registrations.empty? + if not @event.tickets.empty? - min, max = @event.registrations.pluck(:created_at).minmax + min, max = @event.tickets.pluck(:created_at).minmax zeros = Hash[] while min <= max zeros[min.strftime("%Y-%m-%d")] = 0 @@ -78,7 +71,7 @@ def statistics end @data = @event.access_levels.map do |al| - {name: al.name, data: zeros.merge(al.registrations.group('date(registrations.created_at)').count)} + {name: al.name, data: zeros.merge(al.tickets.group('date(tickets.created_at)').count)} end else @@ -96,17 +89,17 @@ def check_in authorize! :update, @event barcode = params.require(:code) - @registration = @event.registrations.find_by_barcode barcode + @ticket = @event.tickets.find_by_barcode barcode - if @registration - if not @registration.is_paid - flash.now[:warning] = "Person has not paid yet! Resting amount: €" + @registration.to_pay.to_s - elsif @registration.checked_in_at - flash.now[:warning] = "Person already checked in at " + view_context.nice_time(@registration.checked_in_at) + "!" + if @ticket + if not @ticket.order.is_paid + flash.now[:warning] = "Person has not paid yet! Resting amount: €" + @ticket.order.to_pay.to_s + elsif @ticket.checked_in_at + flash.now[:warning] = "Person already checked in at " + view_context.nice_time(@ticket.checked_in_at) + "!" else flash.now[:success] = "Person has been scanned!" - @registration.checked_in_at = Time.now - @registration.save! + @ticket.checked_in_at = Time.now + @ticket.save! end else flash.now[:error] = "Barcode not found" diff --git a/app/controllers/orders/build_controller.rb b/app/controllers/orders/build_controller.rb new file mode 100644 index 00000000..72545b83 --- /dev/null +++ b/app/controllers/orders/build_controller.rb @@ -0,0 +1,68 @@ +class Orders::BuildController < ApplicationController + include Wicked::Wizard + + steps :add_tickets, :add_info, :add_ticket_info, :confirmation + + def show + @event = Event.find params.require(:event_id) + @order = @event.orders.find params.require(:order_id) + + case step + when :add_tickets + @access_levels = @event.access_levels.find_all { |al| can? :show, al } + when :add_info + when :add_ticket_info + @tickets = @order.tickets + when :confirmation + end + + render_wizard + end + + def create + @event = Event.find params.require(:event_id) + @order = @event.orders.create! status: 'initial' + + redirect_to wizard_path(steps.first, order_id: @order.id) + end + + def update + @event = Event.find params.require(:event_id) + @order = @event.orders.find params.require(:order_id) + + + case step + when :add_tickets + @access_levels = @event.access_levels.find_all { |al| can? :show, al } + params.require(:access_levels).each do |id, amount| + amount = amount[:amount].to_i + tickets = @order.tickets.where(access_level_id: id) + if tickets.count > amount + # destroy last tickets + tickets.where.not(id: tickets.limit(amount).pluck(:id)).destroy_all + else + # create exactly as many as needed + (amount - tickets.count).times do + @order.tickets.create! access_level_id: id, status: 'initial' + end + end + end + when :add_info + @order.update params.require(:order).permit(:name, :email, :email_confirmation, :gsm) + when :add_ticket_info + @tickets = @order.tickets + params.require(:tickets).each do |id, ticket| + @tickets.find(id).update_columns ticket.merge({ status: 'filled_in' }) + end + when :confirmation + @order.deliver + end + + @order.status = step.to_s + @order.status = 'active' if step == steps.last + @order.save + + render_wizard @order + end + +end diff --git a/app/controllers/orders_controller.rb b/app/controllers/orders_controller.rb new file mode 100644 index 00000000..92da78bb --- /dev/null +++ b/app/controllers/orders_controller.rb @@ -0,0 +1,134 @@ +class OrdersController < ApplicationController + + before_action :authenticate_user!, only: [:index, :destroy, :resend, :update, :email, :upload] + + require 'csv' + + respond_to :html, :js + + def index + @event = Event.find params.require(:event_id) + + authorize! :read, @event + + @ordersgrid = OrdersGrid.new(params[:orders_grid]) do |scope| + scope.where(event_id: @event.id).order("orders.price - paid DESC") + end + + @orders = @ordersgrid.assets + @orders = @orders.paginate(page: params[:page], per_page: 25) + end + + def new + @event = Event.find params.require(:event_id) + @orders = Order.new + end + + def destroy + @event = Event.find params.require(:event_id) + authorize! :destroy, @event + order = Order.find params.require(:id) + @id = order.id + order.destroy + end + + def info + @order = Order.find params.require(:id) + authorize! :read, @order.event + end + + def resend + @order = Order.find params.require(:id) + authorize! :update, @order.event + + @order.deliver + end + + def create + @event = Event.find params.require(:event_id) + + # Check if the user can register + authorize! :register, @event + + render "events/show" + end + + def update + @order = Order.find params.require(:id) + authorize! :update, @order + + paid = @order.paid + @order.update params.require(:order).permit(:to_pay) + if @order.paid != paid # Did the amount change? + @order.deliver + end + + respond_with @order + end + + def email + @event = Event.find params.require(:event_id) + authorize! :read, @event + + to = @event.orders.pluck(:email) + + MassMailer.general_message(@event.contact_email, to, params['email']['subject'], params['email']['body']).deliver + + redirect_to event_orders_path(@event) + end + + def upload + @event = Event.find params.require(:event_id) + authorize! :update, @event + sep = params.require('separator') + paid = params.require('amount_column').upcase + fails = [] + counter = 0 + + begin + CSV.parse(params.require(:csv_file).read.upcase, col_sep: sep, headers: :first_row) do |row| + + order = Order.find_payment_code_from_csv(row.to_s) + # If the order doesn't exist + unless order + fails << row if order.nil? + next + end + + # if we can't read the amount of money, FAIL + amount = row[paid].sub(',', '.') + begin + amount = Float(amount) + rescue + fails << row + next + end + + order.paid += amount + order.payment_code = Order.create_payment_code + order.save + + order.deliver + + counter += 1 + end + + success_msg = "Updated #{ActionController::Base.helpers.pluralize counter, "payment"} successfully." + if fails.any? + flash.now[:success] = success_msg + flash.now[:error] = "The rows listed below contained an invalid code, please fix them by hand." + @csvheaders = fails.first.headers + @csvfails = fails + render 'upload' + else + flash[:success] = success_msg + redirect_to action: :index + end + rescue CSV::MalformedCSVError + flash[:error] = "The file could not be parsed. Make sure that you uploaded the correct file and that the column seperator settings have been set to the correct seperator." + redirect_to action: :index + end + + end + +end diff --git a/app/controllers/partners_controller.rb b/app/controllers/partners_controller.rb index 7acabf55..30ab0490 100644 --- a/app/controllers/partners_controller.rb +++ b/app/controllers/partners_controller.rb @@ -81,18 +81,24 @@ def confirm if @partner.confirmed flash.now[:error] = "You have already registered for this event. Please check your mailbox." else - @registration = @event.registrations.new( + @order = @event.orders.new( + name: @partner.name, email: @partner.email, + price: @partner.access_level.price, + paid: 0, + ) + @ticket = @order.tickets.new( name: @partner.name, + email: @partner.email, student_number: nil, comment: nil, - price: @partner.access_level.price, - paid: 0 + access_level: @partner.access_level, + event: @event, ) - @registration.access_levels << @partner.access_level @partner.confirmed = true - if @registration.save and @partner.save then - @registration.deliver + + if @ticket.save and @order.save and @partner.save then + @order.deliver flash.now[:success] = "Your invitation has been confirmed. Your ticket should arrive shortly." else flash.now[:error] = "Is seems there already is someone with your name and/or email registered for this event. #{view_context.mail_to @event.contact_email, "Contact us"} if this is not correct.".html_safe diff --git a/app/controllers/periods_controller.rb b/app/controllers/periods_controller.rb deleted file mode 100644 index 42563832..00000000 --- a/app/controllers/periods_controller.rb +++ /dev/null @@ -1,36 +0,0 @@ -class PeriodsController < ApplicationController - - # You need to be logged in for everything. - before_action :authenticate_user! - - respond_to :html, :js - - def index - @event = Event.find params.require(:event_id) - authorize! :read, @event - end - - def show - @period = Period.find params.require(:id) - authorize! :read, @period.event - end - - def new - @period = Period.new - end - - def create - @event = Event.find params.require(:event_id) - authorize! :update, @event - @period = @event.periods.create params.require(:period).permit(:name, :starts, :ends) - end - - def destroy - @event = Event.find params.require(:event_id) - authorize! :update, @event - period = Period.find params.require(:id) - @id = period.id - period.destroy - end - -end diff --git a/app/controllers/registrations_controller.rb b/app/controllers/registrations_controller.rb deleted file mode 100644 index be4d549c..00000000 --- a/app/controllers/registrations_controller.rb +++ /dev/null @@ -1,190 +0,0 @@ -class RegistrationsController < ApplicationController - - before_action :authenticate_user!, only: [:index, :destroy, :resend, :update, :email, :upload] - - require 'csv' - - respond_to :html, :js - - def index - @event = Event.find params.require(:event_id) - - authorize! :read, @event - - @registrationsgrid = RegistrationsGrid.new(params[:registrations_grid]) do |scope| - scope.where(event_id: @event.id).order("registrations.price - paid DESC") - end - - @registrations = @registrationsgrid.assets - @registrations = @registrations.paginate(page: params[:page], per_page: 25) - end - - def new - @event = Event.find params.require(:event_id) - @registration = Registration.new - end - - def destroy - @event = Event.find params.require(:event_id) - authorize! :destroy, @event - registration = Registration.find params.require(:id) - @id = registration.id - registration.destroy - end - - def info - @registration = Registration.find params.require(:id) - authorize! :read, @registration.event - end - - def resend - @registration = Registration.find params.require(:id) - authorize! :update, @registration.event - if @registration.is_paid - RegistrationMailer.ticket(@registration).deliver - else - RegistrationMailer.confirm_registration(@registration).deliver - end - end - - def basic - @event = Event.find params.require(:event_id) - - # Check if the user can register - authorize! :register, @event - requested_access_level = @event.access_levels.find(params.require(:registration).require(:access_levels)) - authorize! :register, requested_access_level - - # Make the registration - @registration = @event.registrations.new params.require(:registration).permit(:email, :name, :student_number, :comment) - @registration.access_levels << requested_access_level - @registration.price = requested_access_level.price - @registration.paid = 0 - - # overwrite student_number so setting this will not work - if requested_access_level.member_only? - @registration.student_number = current_user.cas_ugentStudentID - end - @registration.save - - # Send the confirmation email. - if not @registration.errors.any? - @registration.generate_barcode - - if @registration.is_paid - RegistrationMailer.ticket(@registration).deliver - else - RegistrationMailer.confirm_registration(@registration).deliver - end - - flash[:success] = "Registration successful. Please check your mailbox for your ticket or further payment information." - respond_with @event - else - render "events/show" - end - end - - def advanced - # TODO can can - @event = Event.find params.require(:event_id) - @registration = @event.registrations.create params.require(:registration).permit(:email, :name) - params.require(:registration).require(:checkboxes).each do |access_level, periods| - periods.each do |period, checked| - if checked == "on" then - access = @registration.accesses.build access_level_id: access_level, period_id: period - access.save - end - end - end - end - - def update - @registration = Registration.find params.require(:id) - paid = @registration.paid - authorize! :update, @registration - @registration.update params.require(:registration).permit(:to_pay) - if @registration.paid != paid then - if @registration.is_paid - RegistrationMailer.ticket(@registration).deliver - if @registration.paid > @registration.price - RegistrationMailer.notify_overpayment(@registration).deliver - end - else - RegistrationMailer.confirm_registration(@registration).deliver - end - end - respond_with @registration - end - - def email - @event = Event.find params.require(:event_id) - authorize! :read, @event - to_id = params['to'].to_i - if to_id == -1 - to = @event.registrations.pluck(:email) - else - to = @event.access_levels.find_by_id(to_id).registrations.pluck(:email) - end - MassMailer.general_message(@event.contact_email, to, params['email']['subject'], params['email']['body']).deliver - redirect_to event_registrations_path(@event) - end - - def upload - @event = Event.find params.require(:event_id) - authorize! :update, @event - sep = params.require('separator') - paid = params.require('amount_column').upcase - fails = [] - counter = 0 - - begin - CSV.parse(params.require(:csv_file).read.upcase, col_sep: sep, headers: :first_row) do |row| - - registration = Registration.find_payment_code_from_csv(row.to_s) - # If the registration doesn't exist - unless registration - fails << row if registration.nil? - next - end - - # if we can't read the amount of money, FAIL - amount = row[paid].sub(',', '.') - begin - amount = Float(amount) - rescue - fails << row - next - end - - registration.paid += amount - registration.payment_code = Registration.create_payment_code - registration.save - - if registration.is_paid - RegistrationMailer.ticket(registration).deliver - else - RegistrationMailer.confirm_registration(registration).deliver - end - - counter += 1 - end - - success_msg = "Updated #{ActionController::Base.helpers.pluralize counter, "payment"} successfully." - if fails.any? - flash.now[:success] = success_msg - flash.now[:error] = "The rows listed below contained an invalid code, please fix them by hand." - @csvheaders = fails.first.headers - @csvfails = fails - render 'upload' - else - flash[:success] = success_msg - redirect_to action: :index - end - rescue CSV::MalformedCSVError - flash[:error] = "The file could not be parsed. Make sure that you uploaded the correct file and that the column seperator settings have been set to the correct seperator." - redirect_to action: :index - end - - end - -end diff --git a/app/controllers/tickets_controller.rb b/app/controllers/tickets_controller.rb new file mode 100644 index 00000000..363caa2d --- /dev/null +++ b/app/controllers/tickets_controller.rb @@ -0,0 +1,68 @@ +class TicketsController < ApplicationController + + before_action :authenticate_user!, only: [:index, :destroy, :resend, :update, :email, :upload] + + require 'csv' + + respond_to :html, :js + + def index + @event = Event.find params.require(:event_id) + + authorize! :read, @event + + @ticketsgrid = TicketsGrid.new(params[:tickets_grid]) do |scope| + scope.where(event_id: @event.id) + end + + @tickets = @ticketsgrid.assets + @tickets = @tickets.paginate(page: params[:page], per_page: 25) + end + + def new + @event = Event.find params.require(:event_id) + @tickets = Ticket.new + end + + def destroy + @event = Event.find params.require(:event_id) + authorize! :destroy, @event + ticket = Ticket.find params.require(:id) + @id = ticket.id + ticket.destroy + end + + def info + @ticket = Ticket.find params.require(:id) + authorize! :read, @ticket.event + end + + def resend + @ticket = Ticket.find params.require(:id) + authorize! :update, @ticket.event + + TicketMailer.ticket(@ticket).deliver + end + + def create + end + + def update + @ticket = Ticket.find params.require(:id) + respond_with @ticket + end + + def email + @event = Event.find params.require(:event_id) + authorize! :read, @event + to_id = params['to'].to_i + if to_id == -1 + to = @event.tickets.pluck(:email) + else + to = @event.access_levels.find_by_id(to_id).tickets.pluck(:email) + end + MassMailer.general_message(@event.contact_email, to, params['email']['subject'], params['email']['body']).deliver + redirect_to event_tickets_path(@event) + end + +end diff --git a/app/controllers/zones_controller.rb b/app/controllers/zones_controller.rb deleted file mode 100644 index 26895e6b..00000000 --- a/app/controllers/zones_controller.rb +++ /dev/null @@ -1,35 +0,0 @@ -class ZonesController < ApplicationController - - # You need to be logged in for everything. - before_action :authenticate_user!, except: :show - - respond_to :html, :js - - def index - @event = Event.find params.require(:event_id) - authorize! :read, @event - end - - def show - @zone = Zone.find params.require(:id) - end - - def new - @zone = Zone.new - end - - def create - @event = Event.find params.require(:event_id) - authorize! :update, @event - @zone = @event.zones.create params.require(:zone).permit(:name) - end - - def destroy - zone = Zone.find params.require(:id) - @id = zone.id - @event = Event.find params.require(:event_id) - authorize! :update, @event - zone.destroy - end - -end diff --git a/app/grids/orders_grid.rb b/app/grids/orders_grid.rb new file mode 100644 index 00000000..243970e3 --- /dev/null +++ b/app/grids/orders_grid.rb @@ -0,0 +1,24 @@ +class OrdersGrid + include Datagrid + + scope do + Order.active + end + + # We use the lower() instead of ilike because SQLite dev doesn't like ilike + filter(:name) { |value| where("lower(orders.name) like ?", "%#{value.downcase}%") } + filter(:email) { |value| where("lower(orders.email) like ?", "%#{value.downcase}%") } + filter(:payment_code) { |value| where("orders.payment_code like ?","%#{value}%") } + filter(:only_paid) { |value| where("paid = price") if value == '1' } + filter(:only_unpaid) { |value| where.not("paid = price") if value == '1' } + + column(:name) + column(:email) + column(:payment_code) + column(:to_pay, html: true, order: "orders.price - paid", descending: true) do |order| + render partial: 'order_payment_form', locals: { order: order } + end + column(:actions, html: true) do |order| + render partial: 'order_actions', locals: { order: order } + end +end diff --git a/app/grids/registrations_grid.rb b/app/grids/registrations_grid.rb deleted file mode 100644 index 2400cded..00000000 --- a/app/grids/registrations_grid.rb +++ /dev/null @@ -1,30 +0,0 @@ -class RegistrationsGrid - include Datagrid - - scope do - Registration - end - - # We use the lower() instead of ilike because SQLite dev doesn't like ilike - filter(:name) { |value| where("lower(registrations.name) like ?", "%#{value.downcase}%") } - filter(:email) { |value| where("lower(registrations.email) like ?", "%#{value.downcase}%") } - filter(:access_level) { |value, scope| scope.joins(:access_levels).where(access_levels: { id: value }) } - filter(:payment_code) { |value| where("registrations.payment_code like ?","%#{value}%") } - filter(:only_paid) { |value| where("paid = price") if value == '1' } - filter(:only_unpaid) { |value| where.not("paid = price") if value == '1' } - - column(:name) - column(:email) - column(:access_level, header: "Ticket", order: proc { |scope| - scope.joins(:accesses).joins(:access_levels).order("access_levels.name") - }) do |registration| - registration.access_levels.first.try :name - end - column(:payment_code) - column(:to_pay, html: true, order: "registrations.price - paid", descending: true) do |registration| - render partial: 'registration_payment_form', locals: { registration: registration } - end - column(:actions, html: true) do |registration| - render partial: 'registration_actions', locals: { registration: registration } - end -end diff --git a/app/grids/tickets_grid.rb b/app/grids/tickets_grid.rb new file mode 100644 index 00000000..f1501eea --- /dev/null +++ b/app/grids/tickets_grid.rb @@ -0,0 +1,23 @@ +class TicketsGrid + include Datagrid + + scope do + Ticket.active + end + + # We use the lower() instead of ilike because SQLite dev doesn't like ilike + filter(:name) { |value| where("lower(tickets.name) like ?", "%#{value.downcase}%") } + filter(:email) { |value| where("lower(tickets.email) like ?", "%#{value.downcase}%") } + filter(:access_level) { |value, scope| scope.joins(:access_levels).where(access_levels: { id: value }) } + + column(:name) + column(:email) + column(:access_level, header: "Ticket", order: proc { |scope| + scope.joins(:access_levels).order("access_levels.name") + }) do |ticket| + ticket.access_level.try :name + end + column(:actions, html: true) do |ticket| + render partial: 'ticket_actions', locals: { ticket: ticket } + end +end diff --git a/app/helpers/orders_helper.rb b/app/helpers/orders_helper.rb new file mode 100644 index 00000000..70dd31a0 --- /dev/null +++ b/app/helpers/orders_helper.rb @@ -0,0 +1,12 @@ +module OrdersHelper + + def nice_changeset(name, change) + case name + when 'paid' + "Changed the amount paid from #{euro(@registration.price - change[0]/100)} to #{euro(@registration.price - change[1])}" + when 'payment_code' + "Payment code updated to #{change[1]}" + end + end + +end diff --git a/app/helpers/registrations_helper.rb b/app/helpers/registrations_helper.rb index c123db3f..b1003768 100644 --- a/app/helpers/registrations_helper.rb +++ b/app/helpers/registrations_helper.rb @@ -1,14 +1,2 @@ module RegistrationsHelper - - def nice_changeset(name, change) - case name - when 'paid' - "Changed the amount paid from #{euro(@registration.price - change[0]/100)} to #{euro(@registration.price - change[1])}" - when 'checked_in_at' - "Checked in at #{nice_time change[1]}" - when 'payment_code' - "Payment code updated to #{change[1]}" - end - end - end diff --git a/app/helpers/tickets_helper.rb b/app/helpers/tickets_helper.rb new file mode 100644 index 00000000..e6a606b6 --- /dev/null +++ b/app/helpers/tickets_helper.rb @@ -0,0 +1,10 @@ +module TicketsHelper + + def nice_changeset(name, change) + case name + when 'checked_in_at' + "Checked in at #{nice_time change[1]}" + end + end + +end diff --git a/app/mailers/order_mailer.rb b/app/mailers/order_mailer.rb new file mode 100644 index 00000000..09b63dea --- /dev/null +++ b/app/mailers/order_mailer.rb @@ -0,0 +1,17 @@ +class OrderMailer < ActionMailer::Base + + helper ApplicationHelper + + default from: "noreply@event.fkgent.be" + + def confirm_order(order) + @order = order + mail to: "#{order.name} <#{order.email}>", subject: "Order for #{order.event.name}" + end + + def notify_overpayment(order) + @order = order + mail to: "#{order.name} <#{order.email}>", subject: "Overpayment for #{order.event.name}" + end + +end diff --git a/app/mailers/registration_mailer.rb b/app/mailers/registration_mailer.rb deleted file mode 100644 index 3e055e7f..00000000 --- a/app/mailers/registration_mailer.rb +++ /dev/null @@ -1,26 +0,0 @@ -class RegistrationMailer < ActionMailer::Base - - helper ApplicationHelper - - default from: "noreply@event.fkgent.be" - - def confirm_registration(registration) - @registration = registration - mail to: "#{registration.name} <#{registration.email}>", subject: "Registration for #{registration.event.name}" - end - - def ticket(registration) - @registration = registration - - barcode = Barcodes.create('EAN13', data: registration.barcode_data, bar_width: 35, bar_height: 1500, caption_height: 300, caption_size: 275 ) # required: height > size - attachments.inline['barcode.png'] = Barcodes::Renderer::Image.new(barcode).render - - mail to: "#{registration.name} <#{registration.email}>", subject: "Ticket for #{registration.event.name}" - end - - def notify_overpayment(registration) - @registration = registration - mail to: "#{registration.name} <#{registration.email}>", subject: "Overpayment for #{registration.event.name}" - end - -end diff --git a/app/mailers/ticket_mailer.rb b/app/mailers/ticket_mailer.rb new file mode 100644 index 00000000..217cf4a7 --- /dev/null +++ b/app/mailers/ticket_mailer.rb @@ -0,0 +1,16 @@ +class TicketMailer < ActionMailer::Base + + helper ApplicationHelper + + default from: "noreply@event.fkgent.be" + + def ticket(ticket) + @ticket = ticket + + barcode = Barcodes.create('EAN13', data: ticket.barcode_data, bar_width: 35, bar_height: 1500, caption_height: 300, caption_size: 275 ) # required: height > size + attachments.inline['barcode.png'] = Barcodes::Renderer::Image.new(barcode).render + + mail to: "#{ticket.name} <#{ticket.email}>", subject: "Ticket for #{ticket.event.name}" + end + +end diff --git a/app/models/ability.rb b/app/models/ability.rb index c90c4238..6fa60cd9 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -39,7 +39,8 @@ def user_rules(user) # Admins can do anything! if user.admin? can :manage, Event - can :manage, Registration + can :manage, Ticket + can :manage, Order can :manage, Partner end @@ -56,6 +57,18 @@ def user_rules(user) end end + can :show, AccessLevel do |access_level| + # not if you can't register for the event + next false unless can? :register, access_level.event + + next false if access_level.hidden + + # don't support private tickets for the moment + next false unless access_level.public + + true + end + # can you register for an access level can :register, AccessLevel do |access_level| # not if you can't register for the event @@ -74,9 +87,14 @@ def user_rules(user) end end - # add modify registrations permission for club members - can :update, Registration do |registration| - clubs.include? registration.event.club + # add modify tickets permission for club members + can :update, Ticket do |ticket| + clubs.include? ticket.event.club + end + + # add modify tickets permission for club members + can :update, Order do |order| + clubs.include? order.event.club end # can view statistics? diff --git a/app/models/access.rb b/app/models/access.rb deleted file mode 100644 index 83ce2998..00000000 --- a/app/models/access.rb +++ /dev/null @@ -1,17 +0,0 @@ -# == Schema Information -# -# Table name: accesses -# -# id :integer not null, primary key -# period_id :integer -# registration_id :integer -# created_at :datetime -# updated_at :datetime -# access_level_id :integer -# - -class Access < ActiveRecord::Base - belongs_to :access_level - belongs_to :period - belongs_to :registration -end diff --git a/app/models/access_level.rb b/app/models/access_level.rb index 58b87a9e..b201d406 100644 --- a/app/models/access_level.rb +++ b/app/models/access_level.rb @@ -10,7 +10,7 @@ # updated_at :datetime # capacity :integer # price :integer -# public :boolean default(TRUE) +# public :boolean default("t") # has_comment :boolean # hidden :boolean # member_only :boolean @@ -19,11 +19,9 @@ class AccessLevel < ActiveRecord::Base belongs_to :event - has_many :included_zones, dependent: :destroy - has_many :zones, through: :included_zones + has_many :tickets - has_many :accesses, dependent: :destroy - has_many :registrations, through: :accesses + attr_accessor :amount has_and_belongs_to_many :promos @@ -54,7 +52,7 @@ def name_with_price end def tickets_left - capacity - registrations.count if capacity.presence + self.capacity - self.tickets.count if self.capacity.presence end def price diff --git a/app/models/event.rb b/app/models/event.rb index 2859be18..4ee7be20 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -14,16 +14,16 @@ # registration_open_date :datetime # registration_close_date :datetime # bank_number :string(255) -# show_ticket_count :boolean default(TRUE) +# show_ticket_count :boolean default("t") # contact_email :string(255) # export_file_name :string(255) # export_content_type :string(255) # export_file_size :integer # export_updated_at :datetime -# export_status :string(255) # show_statistics :boolean +# export_status :string(255) # club_id :integer -# registration_open :boolean default(TRUE) +# registration_open :boolean default("t") # class Event < ActiveRecord::Base @@ -32,12 +32,10 @@ class Event < ActiveRecord::Base has_many :access_levels, dependent: :destroy has_many :partners, dependent: :destroy - has_many :zones, dependent: :destroy - has_many :registrations, dependent: :destroy + has_many :tickets, through: :orders + has_many :orders, dependent: :destroy has_many :promos, dependent: :destroy - has_many :periods, dependent: :destroy - validates :description, presence: true validates :end_date, presence: true validates :location, presence: true @@ -65,9 +63,9 @@ def generate_xls xls = Spreadsheet::Workbook.new sheet = xls.create_worksheet - sheet.update_row 0, "Naam", "Email", "Studentnummer", "Ticket", "Comment" - registrations.select(&:is_paid).each.with_index do |reg, i| - sheet.update_row i + 1, reg.name, reg.email, reg.student_number, reg.access_levels.first.name, reg.comment + sheet.update_row 0, "Naam", "Email", "Studentnummer", "Ticket", "Comment", "Is paid" + tickets.each.with_index do |ticket, i| + sheet.update_row i + 1, ticket.name, ticket.email, ticket.student_number, ticket.access_level.name, ticket.comment, ticket.order.is_paid end data = Tempfile.new(["export", ".xls"]) diff --git a/app/models/included_zone.rb b/app/models/included_zone.rb deleted file mode 100644 index 40c189ce..00000000 --- a/app/models/included_zone.rb +++ /dev/null @@ -1,15 +0,0 @@ -# == Schema Information -# -# Table name: included_zones -# -# id :integer not null, primary key -# zone_id :integer -# access_level_id :integer -# created_at :datetime -# updated_at :datetime -# - -class IncludedZone < ActiveRecord::Base - belongs_to :zone - belongs_to :access_level -end diff --git a/app/models/order.rb b/app/models/order.rb new file mode 100644 index 00000000..456f707a --- /dev/null +++ b/app/models/order.rb @@ -0,0 +1,137 @@ +# == Schema Information +# +# Table name: orders +# +# id :integer not null, primary key +# status :string default("initial") +# name :string +# email :string +# gsm :string +# ticket_id :integer +# event_id :integer +# paid :integer +# price :integer +# created_at :datetime +# updated_at :datetime +# payment_code :string +# + +class Order < ActiveRecord::Base + belongs_to :event + has_many :tickets + + scope :paid, -> { where("price <= paid") } + scope :active, -> { where(status: 'active') } + + has_paper_trail only: [:paid, :payment_code] + + # Should validate on add_tickets + validates :tickets, presence: { message: "is empty! Please pick at least one." }, if: :active_or_add_tickets? + + # Should validate on add_info + validates :name, presence: true, if: :active_or_add_info? + # This should be a setting per event basis + # validates :gsm, presence: true, if: :active_or_add_info? + validates :email, email: true, presence: true, confirmation: true, if: :active_or_add_info? + + # Should validate on add_ticket_info + validates_associated :tickets, if: :active_or_add_ticket_info? + + # Should validate on pay + validates :paid, presence: true, numericality: { only_integer: true }, if: :active_or_pay? + validates :price, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 0 }, if: :active_or_pay? + validates :payment_code, presence: true, uniqueness: true, if: :active_or_pay? + + default_scope { order "name ASC" } + + before_validation do |record| + if record.payment_code.nil? then + record.payment_code = self.class.create_payment_code + end + end + + # Wicked methods + def active? + status == 'active' + end + + def active_or_add_tickets? + status.include?('add_tickets') || active? + end + + def active_or_add_info? + status.include?('add_info') || active? + end + + def active_or_add_ticket_info? + status.include?('add_ticket_info') || active? + end + + def active_or_pay? + status.include?('pay') || active? + end + + def paid + from_cents read_attribute(:paid) + end + + def paid=(value) + write_attribute :paid, to_cents(value) + end + + def to_pay + self.price - self.paid + end + + def to_pay=(value) + self.paid = self.price - (to_cents(value) / 100.0) + end + + def price + from_cents read_attribute(:price) + end + + def price=(value) + write_attribute(:price, to_cents(value)) + end + + def is_paid + self.price <= self.paid + end + + def self.find_payment_code_from_csv(csvline) + match = /GAN\d+/.match(csvline) + if match + return Order.find_by_payment_code(match[0]) + else + return false + end + end + + def self.create_payment_code + random = rand(10**15) + return sprintf("GAN%02d%015d", random % 97, random) + end + + def deliver + if self.is_paid + self.tickets.all.map(&:deliver) + if self.paid > self.price + OrderMailer.notify_overpayment(self).deliver_now + end + else + OrderMailer.confirm_order(self).deliver_now + end + end + + private + + def from_cents(value) + (value || 0) / 100.0 + end + + def to_cents(value) + if value.is_a? String then value.sub!(',', '.') end + (value.to_f * 100).to_int + end +end diff --git a/app/models/partner.rb b/app/models/partner.rb index f0b0ccad..d2e8b4e7 100644 --- a/app/models/partner.rb +++ b/app/models/partner.rb @@ -12,7 +12,7 @@ # reset_password_token :string(255) # reset_password_sent_at :datetime # remember_created_at :datetime -# sign_in_count :integer default(0), not null +# sign_in_count :integer default("0"), not null # current_sign_in_at :datetime # last_sign_in_at :datetime # current_sign_in_ip :string(255) diff --git a/app/models/period.rb b/app/models/period.rb deleted file mode 100644 index 41cabe0c..00000000 --- a/app/models/period.rb +++ /dev/null @@ -1,17 +0,0 @@ -# == Schema Information -# -# Table name: periods -# -# id :integer not null, primary key -# starts :datetime -# ends :datetime -# name :string(255) -# created_at :datetime -# updated_at :datetime -# event_id :integer -# - -class Period < ActiveRecord::Base - belongs_to :event - has_many :accesses -end diff --git a/app/models/promo.rb b/app/models/promo.rb index 443f48e5..2246d6ea 100644 --- a/app/models/promo.rb +++ b/app/models/promo.rb @@ -8,7 +8,7 @@ # limit :integer # created_at :datetime # updated_at :datetime -# sold_tickets :integer default(0) +# sold_tickets :integer default("0") # class Promo < ActiveRecord::Base diff --git a/app/models/registration.rb b/app/models/registration.rb deleted file mode 100644 index a6b42d6b..00000000 --- a/app/models/registration.rb +++ /dev/null @@ -1,129 +0,0 @@ -# == Schema Information -# -# Table name: registrations -# -# id :integer not null, primary key -# barcode :string(255) -# name :string(255) -# email :string(255) -# created_at :datetime -# updated_at :datetime -# event_id :integer -# paid :integer -# student_number :string(255) -# price :integer -# checked_in_at :datetime -# comment :text -# barcode_data :string(255) -# payment_code :string(255) -# - -class Registration < ActiveRecord::Base - belongs_to :event - has_many :accesses, dependent: :destroy - has_many :access_levels, through: :accesses - - scope :paid, -> { where("price <= paid") } - - validates :name, presence: true, uniqueness: { scope: :event_id } - # Uniqueness temporarily disabled; see the Partner model for the reason - #validates :email, presence: true, uniqueness: { scope: :event_id } - validates :email, presence: true, email: true - validates :student_number, format: {with: /\A[0-9]*\Z/, message: "has invalid format" }, - uniqueness: { scope: :event }, allow_blank: true - validates :student_number, presence: true, if: "access_levels.first.try(:member_only?)" - validates :paid, presence: true, numericality: { only_integer: true } - validates :price, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 0 } - validates :payment_code, presence: true, uniqueness: true - - has_paper_trail only: [:paid, :payment_code, :checked_in_at] - - before_validation do |record| - if record.payment_code.nil? then - record.payment_code = Registration.create_payment_code - end - end - - after_save do |record| - record.access_levels.each do |access_level| - if access_level.capacity != nil and access_level.registrations.count > access_level.capacity - record.errors.add :access_levels, "type is sold out." - raise ActiveRecord::Rollback - end - end - end - - default_scope { order "name ASC" } - - def paid - from_cents read_attribute(:paid) - end - - def paid=(value) - write_attribute :paid, to_cents(value) - end - - def to_pay - self.price - self.paid - end - - def to_pay=(value) - self.paid = self.price - (to_cents(value) / 100.0) - end - - def price - from_cents read_attribute(:price) - end - - def price=(value) - write_attribute(:price, to_cents(value)) - end - - def is_paid - self.price <= self.paid - end - - def generate_barcode - self.barcode_data = 12.times.map { SecureRandom.random_number(10) }.join - calculated_barcode = Barcodes.create('EAN13', data: self.barcode_data) - self.barcode = calculated_barcode.caption_data - self.save! - end - - def self.find_payment_code_from_csv(csvline) - match = /GAN\d+/.match(csvline) - if match - return Registration.find_by_payment_code(match[0]) - else - return false - end - end - - def self.create_payment_code - random = rand(10**15) - return sprintf("GAN%02d%015d", random % 97, random) - end - - def deliver - if self.barcode.nil? - self.generate_barcode - end - - if self.is_paid - RegistrationMailer.ticket(self).deliver - else - RegistrationMailer.confirm_registration(self).deliver - end - end - - private - - def from_cents(value) - (value || 0) / 100.0 - end - - def to_cents(value) - if value.is_a? String then value.sub!(',', '.') end - (value.to_f * 100).to_int - end -end diff --git a/app/models/ticket.rb b/app/models/ticket.rb new file mode 100644 index 00000000..d3cd4e2e --- /dev/null +++ b/app/models/ticket.rb @@ -0,0 +1,87 @@ +# == Schema Information +# +# Table name: tickets +# +# id :integer not null, primary key +# name :string +# email :string +# checked_in_at :datetime +# order_id :integer +# student_number :string +# comment :text +# barcode :string +# barcode_data :string +# created_at :datetime +# updated_at :datetime +# access_level_id :integer +# status :string default("initial") +# + +class Ticket < ActiveRecord::Base + has_one :event, through: :order + belongs_to :order + belongs_to :access_level + + has_paper_trail only: [:checked_in_at] + + scope :active, -> { where(status: 'active') } + default_scope { order(:id) } + + # A ticket should have an access_level set + validates :access_level, presence: true + + # NAME VALIDATION + # name should always be present + validates :name, uniqueness: { scope: [:order, :access_level] }, presence: true, if: :parent_add_ticket_info? + # a user cannot order a ticket which name already exists in a valid order in the event + validates :name, uniqueness: { scope: :event }, if: Proc.new { |t| t.access_level.member_only && t.order.active? } + + # EMAIL VALIDATION + # email should always be present + validates :email, presence: true, if: :parent_add_ticket_info? + + validates :student_number, + format: {with: /\A[0-9]*\Z/, message: "has invalid format" }, + uniqueness: { scope: :event }, presence: true, + if: Proc.new { |t| t.access_level.member_only && t.order.active? } + + # after_save do |ticket| + # al = ticket.access_level + # if al.capacity != nil and al.tickets.count > al.capacity + # ticket.errors.add :access_level, "type is sold out." + # raise ActiveRecord::Rollback + # end + # end + + def initial? + status == 'initial' + end + + def filled_in? + status == 'filled_in' + end + + def active? + status == 'active' + end + + def parent_add_ticket_info? + self.order.active_or_add_ticket_info? + end + + def deliver + if self.barcode.nil? + self.generate_barcode + end + + TicketMailer.ticket(self).deliver_now + end + + def generate_barcode + self.barcode_data = 12.times.map { SecureRandom.random_number(10) }.join + calculated_barcode = Barcodes.create('EAN13', data: self.barcode_data) + self.barcode = calculated_barcode.caption_data + self.save! + end + +end diff --git a/app/models/user.rb b/app/models/user.rb index ced33f4a..5ea3bf15 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -5,7 +5,7 @@ # id :integer not null, primary key # username :string(255) default(""), not null # remember_created_at :datetime -# sign_in_count :integer default(0), not null +# sign_in_count :integer default("0"), not null # current_sign_in_at :datetime # last_sign_in_at :datetime # current_sign_in_ip :string(255) @@ -37,8 +37,8 @@ def digest(*args) end # using httparty because it is much easier to read than net/http code - resp = HTTParty.get(Rails.application.config.fk_auth_url, :query => { - :k => digest(username, Rails.application.config.fk_auth_key), + resp = HTTParty.get(Rails.application.secrets.fk_auth_url, :query => { + :k => digest(username, Rails.application.secrets.fk_auth_key), :u => username }) @@ -47,7 +47,7 @@ def digest(*args) hash = JSON[resp.body] clubs_dig = hash['data'].map { |c| c['internalName'] } - dig = digest(Rails.application.config.fk_auth_salt, username, clubs_dig) + dig = digest(Rails.application.secrets.fk_auth_salt, username, clubs_dig) # Process clubs if the controle is correct if hash['controle'] == dig @@ -91,7 +91,7 @@ def display_name # fetch clubs where user is enrolled in def fetch_enrolled_clubs resp = HTTParty.get("http://registratie.fkgent.be/api/v2/members/clubs_for_ugent_nr.json", query: - {key: Rails.application.config.enrollment_key, ugent_nr: self.cas_ugentStudentID}) + {key: Rails.application.secrets.enrolment_key, ugent_nr: self.cas_ugentStudentID}) if resp.code == 200 clubs = JSON[resp.body].map(&:downcase) diff --git a/app/models/zone.rb b/app/models/zone.rb deleted file mode 100644 index 5f5c3540..00000000 --- a/app/models/zone.rb +++ /dev/null @@ -1,18 +0,0 @@ -# == Schema Information -# -# Table name: zones -# -# id :integer not null, primary key -# name :string(255) -# event_id :integer -# created_at :datetime -# updated_at :datetime -# - -class Zone < ActiveRecord::Base - belongs_to :event - has_many :included_zones, dependent: :destroy - has_many :access_levels, through: :included_zones - - validates :name, presence: true -end diff --git a/app/views/access_levels/_access_level.html.erb b/app/views/access_levels/_access_level.html.erb index ed9155af..e022f9b5 100644 --- a/app/views/access_levels/_access_level.html.erb +++ b/app/views/access_levels/_access_level.html.erb @@ -1,7 +1,7 @@ <%= access_level.name %> - <%= access_level.registrations.size %> (<%= access_level.registrations.paid.size %>) / <%= access_level.capacity.presence || "∞".html_safe %> + <%= access_level.tickets.size %> <%= "#{pluralize(access_level.tickets_left, "ticket")} left" if access_level.capacity.presence %> € <%= number_with_precision access_level.price || "0", precision: 2 %> @@ -9,13 +9,10 @@ <%= access_level.member_only ? 'Yes' : 'No' %> <%= access_level.has_comment ? 'Yes' : 'No' %> <%= access_level.hidden ? 'Yes' : 'No' %> - <% if advanced %> - <%= render partial: 'access_levels/zones', locals: {access_level: access_level} %> - <% end %>
<%= link_to raw(visibility_icon(access_level)), toggle_visibility_event_access_level_path(access_level.event, access_level), class: 'btn btn-xs btn-default', remote: true %> - <% unless access_level.registrations.any? %> + <% unless access_level.tickets.any? %> <%= link_to raw(' Edit'), edit_event_access_level_path(access_level.event, access_level), class: 'btn btn-xs btn-default', remote: true %> <%= link_to raw(' Delete'), event_access_level_path(access_level.event, access_level), class: 'btn btn-xs btn-danger', data: {confirm: 'Are you sure?'}, remote: true, method: :delete %> <% end %> diff --git a/app/views/access_levels/_zones.html.erb b/app/views/access_levels/_zones.html.erb deleted file mode 100644 index 4c1a3fcd..00000000 --- a/app/views/access_levels/_zones.html.erb +++ /dev/null @@ -1,9 +0,0 @@ -<%= form_for [access_level.event, access_level], - url: set_zones_for_access_level_path(access_level.event, access_level), - remote: true do |f| %> - <%= f.collection_check_boxes(:zones, access_level.event.zones, lambda {|z| [z.id, access_level.id]}, :name, checked: access_level.zones.map {|z| [z.id, access_level.id]}) do |b| %> - <%= b.check_box %> - <%= b.label { b.text } %> -
- <% end %> -<% end %> diff --git a/app/views/access_levels/create.js.erb b/app/views/access_levels/create.js.erb index 93de79bb..e4a620bc 100644 --- a/app/views/access_levels/create.js.erb +++ b/app/views/access_levels/create.js.erb @@ -5,5 +5,5 @@ $('#new_access_level')[0].reset() <%# break advanced deliberately, how we currently do it will not continue working! %> - $('#table-access-levels tr:last').before('<%= escape_javascript render @access_level, advanced: false %>') + $('#table-access-levels tr:last').before('<%= escape_javascript render @access_level %>') <% end %> diff --git a/app/views/access_levels/index.html.erb b/app/views/access_levels/index.html.erb index 05b191da..88f7bbac 100644 --- a/app/views/access_levels/index.html.erb +++ b/app/views/access_levels/index.html.erb @@ -13,13 +13,10 @@ Member Only Allows comments Hidden - <% if @advanced %> - Zones - <% end %> Actions - <%= render @event.access_levels, advanced: @advanced %> + <%= render @event.access_levels %> <%= render "access_levels/form", object: @event.access_levels.build, button_name: "Add Ticket" %> diff --git a/app/views/access_levels/toggle_visibility.js.erb b/app/views/access_levels/toggle_visibility.js.erb index b168e8a9..cc947e40 100644 --- a/app/views/access_levels/toggle_visibility.js.erb +++ b/app/views/access_levels/toggle_visibility.js.erb @@ -1 +1 @@ -$("#<%= dom_id(@access_level) %>").replaceWith("<%= escape_javascript render @access_level, advanced: @advanced %>"); +$("#<%= dom_id(@access_level) %>").replaceWith("<%= escape_javascript render @access_level %>"); diff --git a/app/views/access_levels/update.js.erb b/app/views/access_levels/update.js.erb index 89eded1f..0636fca0 100644 --- a/app/views/access_levels/update.js.erb +++ b/app/views/access_levels/update.js.erb @@ -2,7 +2,7 @@ $('#access-level-errors').html("<%= escape_javascript form_errors(@access_level) %>") <% else %> $('#access-level-errors').html('') - $('#edit_<%= dom_id(@access_level) %>').parent().replaceWith("<%=j render @access_level, advanced: false %>"); + $('#edit_<%= dom_id(@access_level) %>').parent().replaceWith("<%=j render @access_level %>"); var id = "#new_access_level"; var inputs = $(id).parent().find('input'); diff --git a/app/views/events/_tabs.html.erb b/app/views/events/_tabs.html.erb index 36f22596..3c2726dd 100644 --- a/app/views/events/_tabs.html.erb +++ b/app/views/events/_tabs.html.erb @@ -15,8 +15,9 @@ <% end %> <% if can? :crud, @event %>
  • ><%= link_to "Edit event", edit_event_path(@event) %>
  • -
  • ><%= link_to "Registrations", event_registrations_path(@event) %>
  • -
  • ><%= link_to "Tickets", event_access_levels_path(@event, advanced: false) %>
  • +
  • ><%= link_to "Registrations", event_tickets_path(@event) %>
  • +
  • ><%= link_to "Orders", event_orders_path(@event) %>
  • +
  • ><%= link_to "Tickets", event_access_levels_path(@event) %>
  • ><%= link_to "Partners", event_partners_path(@event) %>
  • ><%= link_to "Promo", event_promos_path(@event) %>
  • ><%= link_to "Scan", scan_event_path(@event) %>
  • diff --git a/app/views/events/export_status.js.erb b/app/views/events/export_status.js.erb index 1030e27f..5ceb43ac 100644 --- a/app/views/events/export_status.js.erb +++ b/app/views/events/export_status.js.erb @@ -1,2 +1 @@ $('#export-link').replaceHtml('<%= escape_javascript(render 'events/export') %>'); -console.log('test'); diff --git a/app/views/events/scan.html.erb b/app/views/events/scan.html.erb index 53d05e27..97087d9d 100644 --- a/app/views/events/scan.html.erb +++ b/app/views/events/scan.html.erb @@ -6,19 +6,19 @@ <%= render partial: 'flash' %> - <% if @registration %> + <% if @ticket %>

    Ticket information:

    - - - - - - - <% unless @registration.comment.blank? %> - + + + + + + + <% unless @ticket.comment.blank? %> + <% end %>
    Name:<%= @registration.name %>
    E-mail:<%= @registration.email %>
    Student number: <%= @registration.student_number %>
    Registered at:<%= nice_time @registration.created_at %>
    Barcode:<%= @registration.barcode %>
    Ticket: <%= @registration.access_levels[0].name %>
    Comment: <%= @registration.comment %>
    Name:<%= @ticket.name %>
    E-mail:<%= @ticket.email %>
    Student number: <%= @ticket.student_number %>
    Registered at:<%= nice_time @ticket.created_at %>
    Barcode:<%= @ticket.barcode %>
    Ticket: <%= @ticket.access_level.name %>
    Comment: <%= @ticket.comment %>
    diff --git a/app/views/events/show.html.erb b/app/views/events/show.html.erb index 4ce22c1a..7089175c 100644 --- a/app/views/events/show.html.erb +++ b/app/views/events/show.html.erb @@ -1,7 +1,7 @@ <%= render partial: "events/tabs" %>
    -
    +

    Description

    @@ -35,6 +35,8 @@
    +
    +
    <% unless @event.access_levels.blank? %>

    Tickets

    @@ -46,12 +48,7 @@
    - <% end %> -
    - <% if can? :register, @event and not @event.access_levels.find_all{ |al| can? :register, al }.blank? %> -
    - <%= render partial: "registrations/form" %> -
    - <% end %> + <%= button_to "Buy tickets now", event_order_build_index_path(@event, :new), class: 'btn btn-primary' %> + <% end %>
    diff --git a/app/views/order_mailer/confirm_order.html.erb b/app/views/order_mailer/confirm_order.html.erb new file mode 100644 index 00000000..ee13aaba --- /dev/null +++ b/app/views/order_mailer/confirm_order.html.erb @@ -0,0 +1,39 @@ + + + + + + + +

    Beste <%= @order.name %>,

    + +

    Bedankt voor het bestellen van een ticket voor <%= @order.event.name %> van <%= @order.event.club.name %>. Als u zich niet opgegeven hebt voor dit ticket, dan heeft iemand anders uw e-mailadres gebruikt om dit te registreren. Mocht dit het geval zijn, mag u deze e-mail negeren.

    + +

    Om uw ticket te ontvangen via e-mail, schrijft u <%= number_with_precision @order.to_pay, precision: 2 %> euro over op het rekeningnummer <%= @order.event.bank_number || "our bank account" %>. Plaats de code "<%= @order.payment_code %>" in de mededeling van de overschrijving (zonder aanhalingstekens). Als u de code vergeet mee te geven of niet correct vermeldt in de beschrijving, dan kunnen wij uw betaling niet verwerken en zal u uw ticket niet ontvangen. U mag maximaal één code ingeven per overschrijving.

    + +

    Gelieve ten laatste 3 dagen voor het evenement te betalen. Indien dit niet meer lukt, gelieve ons te contacteren via <%= mail_to @order.event.contact_email, @order.event.contact_email %> om een andere betalingswijze af te spreken. Eens we uw betaling verwerkt hebben, zal u uw ticket via e-mail ontvangen.

    + +

    Mocht er zich eender welk probleem voordoen, kan u ons altijd via e-mail contacteren: <%= mail_to @order.event.contact_email, @order.event.contact_email %>

    + +

    Met vriendelijke groet,
    <%= @order.event.club.name %>

    + +



    -------------------------------------

    + +

    Dear <%= @order.name %>,

    + +

    Thank you for buying a ticket for <%= @order.event.name %> of <%= @order.event.club.name %>. If you did not register for this ticket, someone else used your email address to register. If this is the case, please ignore this email.

    + +

    To receive your ticket by mail, please transfer <%= number_with_precision @order.to_pay, precision: 2 %> euro to <%= @order.event.bank_number || "our bank account" %>. Place "<%= @order.payment_code %>" in the description of your transfer (without the quotation marks). If you forget this code or you do not copy it correctly, we cannot process your payment and you will not receive your ticket. You are only allowed to enter one code per transfer.

    + +

    Please pay at least 3 days before the event. If this is no longer possible, please contact us via <%= mail_to @order.event.contact_email, @order.event.contact_email %> to agree upon a different payment method. You will receive your ticket by mail once we processed your payment.

    + +

    If you have any problems, you can contact us via mail: <%= mail_to @order.event.contact_email, @order.event.contact_email %>

    + +

    Kind regards,
    <%= @order.event.club.name %>

    + + + + + + + diff --git a/app/views/order_mailer/confirm_order.text.erb b/app/views/order_mailer/confirm_order.text.erb new file mode 100644 index 00000000..ec55ca91 --- /dev/null +++ b/app/views/order_mailer/confirm_order.text.erb @@ -0,0 +1,29 @@ +(English version below) + +Beste <%= @order.name %>, + +Bedankt voor het bestellen van een ticket voor <%= @order.event.name %> van <%= @order.event.club.name %>. Als u zich niet opgegeven hebt voor dit ticket, dan heeft iemand anders uw e-mailadres gebruikt om dit te registreren. Mocht dit het geval zijn, mag u deze e-mail negeren. + +Om uw ticket te ontvangen via e-mail, schrijft u <%= number_with_precision @order.to_pay, precision: 2 %> euro over op het rekeningnummer <%= @order.event.bank_number || "our bank account" %>. Plaats de code "<%= @order.payment_code %>" in de mededeling van de overschrijving (zonder aanhalingstekens). Als u de code vergeet mee te geven of niet correct vermeldt in de beschrijving, dan kunnen wij uw betaling niet verwerken en zal u uw ticket niet ontvangen. U mag maximaal 1 code ingeven per overschrijving. + +Gelieve ten laatste 3 dagen voor het evenement te betalen. Indien dit niet meer lukt, gelieve ons te contacteren via <%= @order.event.contact_email %> om een andere betalingswijze af te spreken. Eens we uw betaling verwerkt hebben, zal u uw ticket via e-mail ontvangen. + +Mocht er zich eender welk probleem voordoen, kan u ons altijd via e-mail contacteren: <%= @order.event.contact_email %> + +Met vriendelijke groet, +<%= @order.event.club.name %> + +------------------------------------- + +Dear <%= @order.name %>, + +Thank you for buying a ticket for <%= @order.event.name %> of <%= @order.event.club.name %>. If you did not register for this ticket, someone else used your email address to register. If this is the case, please ignore this email. + +To receive your ticket by mail, please transfer <%= number_with_precision @order.to_pay, precision: 2 %> euro to <%= @order.event.bank_number || "our bank account" %>. Place "<%= @order.payment_code %>" in the description of your transfer (without the quotation marks). If you forget this code or you do not copy it correctly, we cannot process your payment and you will not receive your ticket. You are only allowed to enter one code per transfer. + +Please pay at least 3 days before the event. If this is no longer possible, please contact us via <%= @order.event.contact_email %> to agree upon a different payment method. You will receive your ticket by mail once we processed your payment. + +If you have any problems, you can contact us via mail: <%= @order.event.contact_email %> + +Kind regards, +<%= @order.event.club.name %> diff --git a/app/views/registration_mailer/notify_overpayment.html.erb b/app/views/order_mailer/notify_overpayment.html.erb similarity index 61% rename from app/views/registration_mailer/notify_overpayment.html.erb rename to app/views/order_mailer/notify_overpayment.html.erb index 5518b0e2..e8260aa4 100644 --- a/app/views/registration_mailer/notify_overpayment.html.erb +++ b/app/views/order_mailer/notify_overpayment.html.erb @@ -4,36 +4,36 @@ -

    Dear <%= @registration.name %>,

    +

    Dear <%= @order.name %>,

    -

    This mail is being sent to you because you payed to much for the ticket you bought with our event management application. Please check out any faults in below information and contact us at <%= mail_to @registration.event.contact_email, @registration.event.contact_email %> for any changes.

    +

    This mail is being sent to you because you payed to much for the ticket you bought with our event management application. Please check out any faults in below information and contact us at <%= mail_to @order.event.contact_email, @order.event.contact_email %> for any changes.

    - + - + - + - + - +
    Event<%= @registration.event.name %><%= @order.event.name %>
    Organisation<%= @registration.event.club.name %><%= @order.event.club.name %>
    Location<%= @registration.event.location %><%= @order.event.location %>
    Price<%= @registration.price %><%= @order.price %>
    Paid<%= @registration.paid %><%= @order.paid %>
    -

    Kind regards,
    <%= @registration.event.club.name %>

    +

    Kind regards,
    <%= @order.event.club.name %>

    diff --git a/app/views/order_mailer/notify_overpayment.text.erb b/app/views/order_mailer/notify_overpayment.text.erb new file mode 100644 index 00000000..35dd1844 --- /dev/null +++ b/app/views/order_mailer/notify_overpayment.text.erb @@ -0,0 +1,17 @@ +Dear <%= @order.name %>, + +This mail is being sent to you because you payed to much for the ticket you bought with our event management application. Please check out any faults in below information and contact us at <%= mail_to @order.event.contact_email, @order.event.contact_email %> for any changes. + +Event: +<%= @order.event.name %> +Organisation: +<%= @order.event.club.name %> +Location: +<%= @order.event.location %> +Price: +<%= @order.price %> +Paid: +<%= @order.paid %> + +Kind regards, +<%= @order.event.club.name %> diff --git a/app/views/orders/_email_modal.html.erb b/app/views/orders/_email_modal.html.erb new file mode 100644 index 00000000..ea924f39 --- /dev/null +++ b/app/views/orders/_email_modal.html.erb @@ -0,0 +1,24 @@ + diff --git a/app/views/registrations/_filter_modal.html.erb b/app/views/orders/_filter_modal.html.erb similarity index 72% rename from app/views/registrations/_filter_modal.html.erb rename to app/views/orders/_filter_modal.html.erb index ae28cc03..3c3e7687 100644 --- a/app/views/registrations/_filter_modal.html.erb +++ b/app/views/orders/_filter_modal.html.erb @@ -5,17 +5,16 @@
    - <%= form_for @registrationsgrid, url: event_registrations_path, method: :get do |f| %> + <%= form_for @ordersgrid, url: event_orders_path, method: :get do |f| %> diff --git a/app/views/orders/_info_content.html.erb b/app/views/orders/_info_content.html.erb new file mode 100644 index 00000000..08b9eefb --- /dev/null +++ b/app/views/orders/_info_content.html.erb @@ -0,0 +1,31 @@ +<% unless @order.comment.blank? %> +

    Comment

    +

    + <%= @order.comment %> +

    +<% end %> + + +

    Changes

    + + + + + + + + <% @order.versions.each do |version| %> + + + + + + + <% end %> +
    ActionByAtDetails
    <%= version.event %><%= version.whodunnit.nil? ? "Anonymous user" : User.find(version.whodunnit).display_name %><%= nice_time version.created_at %> +
      + <% version.changeset.each do |name, change| %> + <%= raw("
    • #{nice_changeset(name, change)}
    • ") unless version.event == 'create' %> + <% end %> +
    +
    diff --git a/app/views/registrations/_info_modal.html.erb b/app/views/orders/_info_modal.html.erb similarity index 100% rename from app/views/registrations/_info_modal.html.erb rename to app/views/orders/_info_modal.html.erb diff --git a/app/views/orders/_order.html.erb b/app/views/orders/_order.html.erb new file mode 100644 index 00000000..6f1e05ec --- /dev/null +++ b/app/views/orders/_order.html.erb @@ -0,0 +1,11 @@ +<%= content_tag_for :tr, order do %> + <%= order.name %> + <%= order.email %> + <%= order.payment_code %> + + <%= render partial: 'order_payment_form', locals: { order: order } %> + + + <%= render partial: 'order_actions', locals: { order: order } %> + +<% end %> diff --git a/app/views/orders/_order_actions.html.erb b/app/views/orders/_order_actions.html.erb new file mode 100644 index 00000000..76a21865 --- /dev/null +++ b/app/views/orders/_order_actions.html.erb @@ -0,0 +1,5 @@ + + <%= link_to raw(' Info'), info_event_order_path(order.event, order), class: 'btn btn-xs btn-default', remote: true %> + <%= link_to raw(' Resend'), resend_event_order_path(order.event, order), class: 'btn btn-xs btn-default', remote: true %> + <%= link_to raw(' Delete'), event_order_path(order.event, order), class: 'btn btn-xs btn-danger', data: { confirm: 'Are you sure?' }, remote: true, method: :delete %> + diff --git a/app/views/registrations/_registration_payment_form.html.erb b/app/views/orders/_order_payment_form.html.erb similarity index 55% rename from app/views/registrations/_registration_payment_form.html.erb rename to app/views/orders/_order_payment_form.html.erb index d2e72a23..5cb8a209 100644 --- a/app/views/registrations/_registration_payment_form.html.erb +++ b/app/views/orders/_order_payment_form.html.erb @@ -1,13 +1,13 @@ -<%= form_for [registration.event, registration], method: :patch, remote: true, html: { class: 'form-inline' } do |f| %> +<%= form_for [order.event, order], method: :patch, remote: true, html: { class: 'form-inline' } do |f| %>
    - <%= f.text_field :to_pay, value: number_with_precision(f.object.to_pay, precision: 2), disabled: true, class: 'disabling registration-paid form-control' %> - <%= f.hidden_field :price, value: number_with_precision(f.object.price, precision: 2), disabled: true, class: 'registration-price' %> + <%= f.text_field :to_pay, value: number_with_precision(f.object.to_pay, precision: 2), disabled: true, class: 'disabling order-paid form-control' %> + <%= f.hidden_field :price, value: number_with_precision(f.object.price, precision: 2), disabled: true, class: 'order-price' %>
    - <%= check_box_tag 'is_paid', '1', f.object.is_paid, class: 'disabling registration-box input-append', disabled: true %> + <%= check_box_tag 'is_paid', '1', f.object.is_paid, class: 'disabling order-box input-append', disabled: true %>
    -
    diff --git a/app/views/registrations/_upload_modal.html.erb b/app/views/orders/_upload_modal.html.erb similarity index 100% rename from app/views/registrations/_upload_modal.html.erb rename to app/views/orders/_upload_modal.html.erb diff --git a/app/views/orders/build/_access_level.html.erb b/app/views/orders/build/_access_level.html.erb new file mode 100644 index 00000000..c27e3937 --- /dev/null +++ b/app/views/orders/build/_access_level.html.erb @@ -0,0 +1,24 @@ + + <%= access_level.name %> + + <%= "#{pluralize(access_level.tickets_left, "ticket")} left" if access_level.capacity.presence %> + + € <%= number_with_precision access_level.price || "0", precision: 2 %> + + <%= af.fields_for access_level.id.to_s, access_level do |al_fields| %> +
    + + + + <%= al_fields.text_field :amount, class: 'form-control', value: order.tickets.where(access_level_id: access_level).count %> + + + +
    + <% end %> + + diff --git a/app/views/orders/build/_order.html.erb b/app/views/orders/build/_order.html.erb new file mode 100644 index 00000000..468f38ed --- /dev/null +++ b/app/views/orders/build/_order.html.erb @@ -0,0 +1 @@ +<%= @order.tickets %> diff --git a/app/views/orders/build/_ticket.html.erb b/app/views/orders/build/_ticket.html.erb new file mode 100644 index 00000000..87a54878 --- /dev/null +++ b/app/views/orders/build/_ticket.html.erb @@ -0,0 +1,24 @@ +<%= tickets.fields_for ticket.id.to_s, ticket do |f| %> + + + <%= ticket.access_level.name %> + + +
    + <%= f.text_field :name, class: 'form-control' %> +
    + + +
    + <%= f.email_field :email, class: 'form-control' %> +
    + + + <% if ticket.errors.any? %> + + + <%= form_errors ticket %> + + + <% end %> +<% end %> diff --git a/app/views/orders/build/add_info.html.erb b/app/views/orders/build/add_info.html.erb new file mode 100644 index 00000000..1f7ef7a4 --- /dev/null +++ b/app/views/orders/build/add_info.html.erb @@ -0,0 +1,23 @@ +<%= render partial: "events/tabs" %> + +
    +
    +

    Enter payment information

    + + <%= form_errors @order %> + <%= render partial: 'flash' %> + + <%= form_for [@event, @order], url: wizard_path do |f| %> + <%= form_text_field f, :name %> + <%= form_email_field f, :email %> + <%= form_email_field f, :email_confirmation %> + <%= form_text_field f, :gsm %> +
      + + +
    + <% end %> +
    +
    diff --git a/app/views/orders/build/add_ticket_info.html.erb b/app/views/orders/build/add_ticket_info.html.erb new file mode 100644 index 00000000..dc8b6046 --- /dev/null +++ b/app/views/orders/build/add_ticket_info.html.erb @@ -0,0 +1,31 @@ +<%= render partial: "events/tabs" %> + +
    +
    +

    Enter ticket information

    + + <%= render partial: 'flash' %> + + <%= form_for [@event, @order], url: wizard_path do |f| %> + <%= fields_for :tickets do |tickets| %> + + + + + + + + <%= render partial: 'ticket', collection: @order.tickets, locals: {tickets: tickets} %> + +
    TicketNameEmail
    + <% end %> +
      + + +
    + <% end %> + +
    +
    diff --git a/app/views/orders/build/add_tickets.html.erb b/app/views/orders/build/add_tickets.html.erb new file mode 100644 index 00000000..a842381c --- /dev/null +++ b/app/views/orders/build/add_tickets.html.erb @@ -0,0 +1,33 @@ +<%= render partial: "events/tabs" %> + +
    +
    +

    Pick your tickets

    + + <%= form_errors @order %> + <%= render partial: 'flash' %> + + <%= form_for [@event, @order], url: wizard_path do |f| %> + <%= fields_for :access_levels do |af| %> + <% @access_levels.partition(&:member_only?).reverse.each do |c| %> +

    <%= c.first.member_only? ? "Member-only Tickets" : "Regular Tickets" %>

    + + + + + + + + + <%= render partial: "access_level", collection: c, locals: {af: af, order: @order} %> + +
    NameTickets leftPriceAmount
    + <% end %> + <% end %> +
      + + +
    + <% end %> +
    +
    diff --git a/app/views/orders/build/confirmation.html.erb b/app/views/orders/build/confirmation.html.erb new file mode 100644 index 00000000..856c406d --- /dev/null +++ b/app/views/orders/build/confirmation.html.erb @@ -0,0 +1,21 @@ +<%= render partial: "events/tabs" %> + +
    +
    +

    Enter ticket information

    + + <%= render partial: 'flash' %> + + <%= render partial: 'orders/build/order' %> + <%= form_for [@event, @order], url: wizard_path do |f| %> + <%= f.submit %> + <% end %> + +
    +
    + +
    +
    + <%= link_to raw(' Back to tickets'), previous_wizard_path, class: 'btn btn-default' %> +
    +
    diff --git a/app/views/orders/destroy.js.erb b/app/views/orders/destroy.js.erb new file mode 100644 index 00000000..d843e7ed --- /dev/null +++ b/app/views/orders/destroy.js.erb @@ -0,0 +1 @@ +$("#order_<%= @id %>").remove() diff --git a/app/views/orders/index.html.erb b/app/views/orders/index.html.erb new file mode 100644 index 00000000..ed2420c8 --- /dev/null +++ b/app/views/orders/index.html.erb @@ -0,0 +1,36 @@ +<%= render partial: "events/tabs" %> + +
    +
    +

    Orders

    + <%= render partial: 'flash' %> + <%= link_to raw(' Filter orders'), '#', class: 'btn btn-default', 'data-toggle' => 'modal', 'data-target' => '#filter-modal' %> + <%= link_to raw(' Upload CSV'), '#', class: 'btn btn-default', 'data-toggle' => 'modal', 'data-target' => '#upload-modal' %> + <%= link_to raw(' Send email'), '#', class: 'btn btn-default', 'data-toggle' => 'modal', 'data-target' => '#mail-modal' %> + Total tickets: <%= @event.orders.size %> (<%= @event.orders.paid.size %> paid) + +
    +
    + + <% if @orders.blank? %> +
    + + Warning! No orders found. If you have set any filters, you can + <%= link_to "reset", event_orders_path(@event) %> these. +
    + <% else %> + <%= bootstrap_pagination @orders %> + + <%= datagrid_header @ordersgrid %> + <%= datagrid_rows @ordersgrid, @orders %> +
    + <%= bootstrap_pagination @orders %> + <% end %> +
    +
    + + +<%= render partial: 'orders/email_modal' %> +<%= render partial: 'orders/upload_modal' %> +<%= render partial: 'orders/info_modal' %> +<%= render partial: 'orders/filter_modal' %> diff --git a/app/views/orders/info.js.erb b/app/views/orders/info.js.erb new file mode 100644 index 00000000..c479234f --- /dev/null +++ b/app/views/orders/info.js.erb @@ -0,0 +1,2 @@ +$('#info-modal .modal-body').html("<%= j render partial: 'orders/info_content' %>"); +$('#info-modal').modal('show'); diff --git a/app/views/orders/resend.js.erb b/app/views/orders/resend.js.erb new file mode 100644 index 00000000..7317e9b6 --- /dev/null +++ b/app/views/orders/resend.js.erb @@ -0,0 +1 @@ +alert("Ticket/order mail resend succesfully"); diff --git a/app/views/orders/update.js.erb b/app/views/orders/update.js.erb new file mode 100644 index 00000000..63598290 --- /dev/null +++ b/app/views/orders/update.js.erb @@ -0,0 +1,2 @@ +$("#flash").replaceWith("<%= escape_javascript render partial: 'flash' %>") +$("#<%= dom_id(@order) %>").replaceWith("<%= escape_javascript render partial: 'order', locals: { order: @order } %>") diff --git a/app/views/registrations/upload.html.erb b/app/views/orders/upload.html.erb similarity index 76% rename from app/views/registrations/upload.html.erb rename to app/views/orders/upload.html.erb index 6c1f9664..6c864d11 100644 --- a/app/views/registrations/upload.html.erb +++ b/app/views/orders/upload.html.erb @@ -3,7 +3,7 @@

    Failed rows

    <%= render partial: 'flash' %> -<%= link_to raw(' Back to registrations'), event_registrations_path(@event), class: 'btn btn-default' %> +<%= link_to raw(' Back to orders'), event_orders_path(@event), class: 'btn btn-default' %> @@ -22,4 +22,4 @@ <% end %>
    -<%= link_to raw(' Back to registrations'), event_registrations_path(@event), class: 'btn btn-default' %> +<%= link_to raw(' Back to orders'), event_orders_path(@event), class: 'btn btn-default' %> diff --git a/app/views/partners/create.js.erb b/app/views/partners/create.js.erb index 915675e9..db69a3bf 100644 --- a/app/views/partners/create.js.erb +++ b/app/views/partners/create.js.erb @@ -4,6 +4,5 @@ $('#partner-errors').html(''); $('#new_partner')[0].reset(); - <%# break advanced deliberately, how we currently do it will not continue working! %> $('#table-partners tr:last').before('<%= escape_javascript render @partner %>') <% end %> diff --git a/app/views/registration_mailer/confirm_registration.html.erb b/app/views/registration_mailer/confirm_registration.html.erb deleted file mode 100644 index 85916233..00000000 --- a/app/views/registration_mailer/confirm_registration.html.erb +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - -

    Beste <%= @registration.name %>,

    - -

    Bedankt voor het bestellen van een ticket voor <%= @registration.event.name %> van <%= @registration.event.club.name %>. Als u zich niet opgegeven hebt voor dit ticket, dan heeft iemand anders uw e-mailadres gebruikt om dit te registreren. Mocht dit het geval zijn, mag u deze e-mail negeren.

    - -

    Om uw ticket te ontvangen via e-mail, schrijft u <%= number_with_precision @registration.to_pay, precision: 2 %> euro over op het rekeningnummer <%= @registration.event.bank_number || "our bank account" %>. Plaats de code "<%= @registration.payment_code %>" in de mededeling van de overschrijving (zonder aanhalingstekens). Als u de code vergeet mee te geven of niet correct vermeldt in de beschrijving, dan kunnen wij uw betaling niet verwerken en zal u uw ticket niet ontvangen. U mag maximaal één code ingeven per overschrijving.

    - -

    Gelieve ten laatste 3 dagen voor het evenement te betalen. Indien dit niet meer lukt, gelieve ons te contacteren via <%= mail_to @registration.event.contact_email, @registration.event.contact_email %> om een andere betalingswijze af te spreken. Eens we uw betaling verwerkt hebben, zal u uw ticket via e-mail ontvangen.

    - -

    Mocht er zich eender welk probleem voordoen, kan u ons altijd via e-mail contacteren: <%= mail_to @registration.event.contact_email, @registration.event.contact_email %>

    - -

    Met vriendelijke groet,
    <%= @registration.event.club.name %>

    - -



    -------------------------------------

    - -

    Dear <%= @registration.name %>,

    - -

    Thank you for buying a ticket for <%= @registration.event.name %> of <%= @registration.event.club.name %>. If you did not register for this ticket, someone else used your email address to register. If this is the case, please ignore this email.

    - -

    To receive your ticket by mail, please transfer <%= number_with_precision @registration.to_pay, precision: 2 %> euro to <%= @registration.event.bank_number || "our bank account" %>. Place "<%= @registration.payment_code %>" in the description of your transfer (without the quotation marks). If you forget this code or you do not copy it correctly, we cannot process your payment and you will not receive your ticket. You are only allowed to enter one code per transfer.

    - -

    Please pay at least 3 days before the event. If this is no longer possible, please contact us via <%= mail_to @registration.event.contact_email, @registration.event.contact_email %> to agree upon a different payment method. You will receive your ticket by mail once we processed your payment.

    - -

    If you have any problems, you can contact us via mail: <%= mail_to @registration.event.contact_email, @registration.event.contact_email %>

    - -

    Kind regards,
    <%= @registration.event.club.name %>

    - - - - - - - diff --git a/app/views/registration_mailer/confirm_registration.text.erb b/app/views/registration_mailer/confirm_registration.text.erb deleted file mode 100644 index 1facbc4d..00000000 --- a/app/views/registration_mailer/confirm_registration.text.erb +++ /dev/null @@ -1,29 +0,0 @@ -(English version below) - -Beste <%= @registration.name %>, - -Bedankt voor het bestellen van een ticket voor <%= @registration.event.name %> van <%= @registration.event.club.name %>. Als u zich niet opgegeven hebt voor dit ticket, dan heeft iemand anders uw e-mailadres gebruikt om dit te registreren. Mocht dit het geval zijn, mag u deze e-mail negeren. - -Om uw ticket te ontvangen via e-mail, schrijft u <%= number_with_precision @registration.to_pay, precision: 2 %> euro over op het rekeningnummer <%= @registration.event.bank_number || "our bank account" %>. Plaats de code "<%= @registration.payment_code %>" in de mededeling van de overschrijving (zonder aanhalingstekens). Als u de code vergeet mee te geven of niet correct vermeldt in de beschrijving, dan kunnen wij uw betaling niet verwerken en zal u uw ticket niet ontvangen. U mag maximaal 1 code ingeven per overschrijving. - -Gelieve ten laatste 3 dagen voor het evenement te betalen. Indien dit niet meer lukt, gelieve ons te contacteren via <%= @registration.event.contact_email %> om een andere betalingswijze af te spreken. Eens we uw betaling verwerkt hebben, zal u uw ticket via e-mail ontvangen. - -Mocht er zich eender welk probleem voordoen, kan u ons altijd via e-mail contacteren: <%= @registration.event.contact_email %> - -Met vriendelijke groet, -<%= @registration.event.club.name %> - -------------------------------------- - -Dear <%= @registration.name %>, - -Thank you for buying a ticket for <%= @registration.event.name %> of <%= @registration.event.club.name %>. If you did not register for this ticket, someone else used your email address to register. If this is the case, please ignore this email. - -To receive your ticket by mail, please transfer <%= number_with_precision @registration.to_pay, precision: 2 %> euro to <%= @registration.event.bank_number || "our bank account" %>. Place "<%= @registration.payment_code %>" in the description of your transfer (without the quotation marks). If you forget this code or you do not copy it correctly, we cannot process your payment and you will not receive your ticket. You are only allowed to enter one code per transfer. - -Please pay at least 3 days before the event. If this is no longer possible, please contact us via <%= @registration.event.contact_email %> to agree upon a different payment method. You will receive your ticket by mail once we processed your payment. - -If you have any problems, you can contact us via mail: <%= @registration.event.contact_email %> - -Kind regards, -<%= @registration.event.club.name %> diff --git a/app/views/registration_mailer/ticket.html.erb b/app/views/registration_mailer/ticket.html.erb deleted file mode 100644 index 684508f2..00000000 --- a/app/views/registration_mailer/ticket.html.erb +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - -

    Dear <%= @registration.name %>,

    - -

    This email is your ticket to enter the following event:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Event<%= @registration.event.name %>
    Organisation<%= @registration.event.club.name %>
    Location<%= @registration.event.location %>
    Start date<%= nice_time @registration.event.start_date %>
    End date<%= nice_time @registration.event.end_date %>
    Website<%= @registration.event.website %>
    - -

    Below is your personal barcode (ticket type: <%= @registration.access_levels.first.try :name %>).

    -
    - <%= image_tag attachments['barcode.png'].url %> -
    - -

    Do not forget to print this email and bring it with you. This email acts as your ticket. Without it, you will not be granted access to <%= @registration.event.name %>.

    - -

    If you have any problems, you can contact us via mail: <%= mail_to @registration.event.contact_email, @registration.event.contact_email %>

    - -

    Kind regards,
    <%= @registration.event.club.name %>

    - - - diff --git a/app/views/registrations/_advanced.html.erb b/app/views/registrations/_advanced.html.erb deleted file mode 100644 index 1333ed77..00000000 --- a/app/views/registrations/_advanced.html.erb +++ /dev/null @@ -1 +0,0 @@ -TODO diff --git a/app/views/registrations/_basic.html.erb b/app/views/registrations/_basic.html.erb deleted file mode 100644 index c30d8e11..00000000 --- a/app/views/registrations/_basic.html.erb +++ /dev/null @@ -1,24 +0,0 @@ -
    -

    - <%= form_errors @registration %> - <%= render partial: 'flash' %> - - <%= form_for [@event, @registration], url: basic_event_registrations_path(@event) do |f| %> - <%= form_text_field f, :name %> - <%= form_email_field f, :email %> - <%= f.hidden_field :student_number %> - - <%= form_collection_select f, :access_levels, @event.access_levels.find_all { |al| can? :register, al }, :id, :name_with_price %> - <%= form_text_area f, :comment %> - <%= javascript_tag do %> - window.ticketsWithComments = <%= @event.access_levels.find_all(&:has_comment).map(&:id).to_json %> - <% end %> - <%= f.submit "Register", class: 'btn btn-group btn-primary' %> - <% end %> -

    - -
    - Payments can be done by bank transfer, not by credit card. -
    - -
    diff --git a/app/views/registrations/_form.html.erb b/app/views/registrations/_form.html.erb deleted file mode 100644 index 717c9c4b..00000000 --- a/app/views/registrations/_form.html.erb +++ /dev/null @@ -1,6 +0,0 @@ -

    Register

    -<% if @event.periods.blank? %> - <%= render partial: "registrations/basic" %> -<% else %> - <%= render partial: "registrations/advanced" %> -<% end %> diff --git a/app/views/registrations/_registration.html.erb b/app/views/registrations/_registration.html.erb deleted file mode 100644 index 56bd7ab8..00000000 --- a/app/views/registrations/_registration.html.erb +++ /dev/null @@ -1,12 +0,0 @@ -<%= content_tag_for :tr, registration do %> - <%= registration.name %> - <%= registration.email %> - <%= registration.access_levels.first.try :name %> - <%= registration.payment_code %> - - <%= render partial: 'registration_payment_form', locals: { registration: registration } %> - - - <%= render partial: 'registration_actions', locals: { registration: registration } %> - -<% end %> diff --git a/app/views/registrations/_registration_actions.html.erb b/app/views/registrations/_registration_actions.html.erb deleted file mode 100644 index 7374013f..00000000 --- a/app/views/registrations/_registration_actions.html.erb +++ /dev/null @@ -1,5 +0,0 @@ - - <%= link_to raw(' Info'), info_event_registration_path(registration.event, registration), class: 'btn btn-xs btn-default', remote: true %> - <%= link_to raw(' Resend'), resend_event_registration_path(registration.event, registration), class: 'btn btn-xs btn-default', remote: true %> - <%= link_to raw(' Delete'), event_registration_path(registration.event, registration), class: 'btn btn-xs btn-danger', data: { confirm: 'Are you sure?' }, remote: true, method: :delete %> - diff --git a/app/views/registrations/destroy.js.erb b/app/views/registrations/destroy.js.erb deleted file mode 100644 index 4b82cb49..00000000 --- a/app/views/registrations/destroy.js.erb +++ /dev/null @@ -1 +0,0 @@ -$("#registration_<%= @id %>").remove() diff --git a/app/views/registrations/info.js.erb b/app/views/registrations/info.js.erb deleted file mode 100644 index 6aa8798a..00000000 --- a/app/views/registrations/info.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$('#info-modal .modal-body').html("<%= j render partial: 'registrations/info_content' %>"); -$('#info-modal').modal('show'); diff --git a/app/views/registrations/new.html.erb b/app/views/registrations/new.html.erb deleted file mode 100644 index 6519e8dc..00000000 --- a/app/views/registrations/new.html.erb +++ /dev/null @@ -1,8 +0,0 @@ -<%= render partial: "events/tabs" %> - -
    -
    -

    Register

    - <%= render partial: "registrations/form" %> -
    -
    diff --git a/app/views/registrations/resend.js.erb b/app/views/registrations/resend.js.erb deleted file mode 100644 index 6fa73c99..00000000 --- a/app/views/registrations/resend.js.erb +++ /dev/null @@ -1 +0,0 @@ -alert("Ticket/registration mail resend succesfully"); diff --git a/app/views/registrations/update.js.erb b/app/views/registrations/update.js.erb deleted file mode 100644 index f8dd716f..00000000 --- a/app/views/registrations/update.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$("#flash").replaceWith("<%= escape_javascript render partial: 'flash' %>") -$("#<%= dom_id(@registration) %>").replaceWith("<%= escape_javascript render partial: 'registration', locals: { registration: @registration } %>") diff --git a/app/views/ticket_mailer/ticket.html.erb b/app/views/ticket_mailer/ticket.html.erb new file mode 100644 index 00000000..66204c11 --- /dev/null +++ b/app/views/ticket_mailer/ticket.html.erb @@ -0,0 +1,52 @@ + + + + + + +

    Dear <%= @ticket.name %>,

    + +

    This email is your ticket to enter the following event:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Event<%= @ticket.event.name %>
    Organisation<%= @ticket.event.club.name %>
    Location<%= @ticket.event.location %>
    Start date<%= nice_time @ticket.event.start_date %>
    End date<%= nice_time @ticket.event.end_date %>
    Website<%= @ticket.event.website %>
    + +

    Below is your personal barcode (ticket type: <%= @ticket.access_level :name %>).

    +
    + <%= image_tag attachments['barcode.png'].url %> +
    + +

    Do not forget to print this email and bring it with you. This email acts as your ticket. Without it, you will not be granted access to <%= @ticket.event.name %>.

    + +

    If you have any problems, you can contact us via mail: <%= mail_to @ticket.event.contact_email, @ticket.event.contact_email %>

    + +

    Kind regards,
    <%= @ticket.event.club.name %>

    + + + diff --git a/app/views/registrations/_email_modal.html.erb b/app/views/tickets/_email_modal.html.erb similarity index 100% rename from app/views/registrations/_email_modal.html.erb rename to app/views/tickets/_email_modal.html.erb diff --git a/app/views/tickets/_filter_modal.html.erb b/app/views/tickets/_filter_modal.html.erb new file mode 100644 index 00000000..0aa2c71e --- /dev/null +++ b/app/views/tickets/_filter_modal.html.erb @@ -0,0 +1,22 @@ + diff --git a/app/views/registrations/_info_content.html.erb b/app/views/tickets/_info_content.html.erb similarity index 100% rename from app/views/registrations/_info_content.html.erb rename to app/views/tickets/_info_content.html.erb diff --git a/app/views/tickets/_info_modal.html.erb b/app/views/tickets/_info_modal.html.erb new file mode 100644 index 00000000..fa6a76e4 --- /dev/null +++ b/app/views/tickets/_info_modal.html.erb @@ -0,0 +1,15 @@ + diff --git a/app/views/tickets/_ticket.html.erb b/app/views/tickets/_ticket.html.erb new file mode 100644 index 00000000..f85e8286 --- /dev/null +++ b/app/views/tickets/_ticket.html.erb @@ -0,0 +1,10 @@ +<%= content_tag_for :tr, ticket do %> + <%= ticket.name %> + <%= ticket.email %> + <%= ticket.access_level :name %> + <%= ticket.payment_code %> + <%= ticket.order.paid? %> + + <%= render partial: 'ticket_actions', locals: { ticket: ticket } %> + +<% end %> diff --git a/app/views/tickets/_ticket_actions.html.erb b/app/views/tickets/_ticket_actions.html.erb new file mode 100644 index 00000000..12706814 --- /dev/null +++ b/app/views/tickets/_ticket_actions.html.erb @@ -0,0 +1,5 @@ + + <%= link_to raw(' Info'), info_event_ticket_path(ticket.event, ticket), class: 'btn btn-xs btn-default', remote: true %> + <%= link_to raw(' Resend'), resend_event_ticket_path(ticket.event, ticket), class: 'btn btn-xs btn-default', remote: true %> + <%= link_to raw(' Delete'), event_ticket_path(ticket.event, ticket), class: 'btn btn-xs btn-danger', data: { confirm: 'Are you sure?' }, remote: true, method: :delete %> + diff --git a/app/views/tickets/destroy.js.erb b/app/views/tickets/destroy.js.erb new file mode 100644 index 00000000..4e8d7c14 --- /dev/null +++ b/app/views/tickets/destroy.js.erb @@ -0,0 +1 @@ +$("#ticket_<%= @id %>").remove() diff --git a/app/views/registrations/index.html.erb b/app/views/tickets/index.html.erb similarity index 52% rename from app/views/registrations/index.html.erb rename to app/views/tickets/index.html.erb index 9710f811..c9228d08 100644 --- a/app/views/registrations/index.html.erb +++ b/app/views/tickets/index.html.erb @@ -5,36 +5,34 @@

    Registrations

    <%= render partial: 'flash' %> <%= link_to raw(' Filter registrations'), '#', class: 'btn btn-default', 'data-toggle' => 'modal', 'data-target' => '#filter-modal' %> - <%= link_to raw(' Upload CSV'), '#', class: 'btn btn-default', 'data-toggle' => 'modal', 'data-target' => '#upload-modal' %> <%= link_to raw(' Send email'), '#', class: 'btn btn-default', 'data-toggle' => 'modal', 'data-target' => '#mail-modal' %> <%= render 'events/export' %> <%= tag :span, id: "export_status_url", data: {url: export_status_event_path(@event)} %> - Total tickets: <%= @event.registrations.size %> (<%= @event.registrations.paid.size %> paid) + Total registrations: <%= @event.tickets.size %>

    - <% if @registrations.blank? %> + <% if @tickets.blank? %>
    Warning! No registrations found. If you have set any filters, you can - <%= link_to "reset", event_registrations_path(@event) %> these. + <%= link_to "reset", event_tickets_path(@event) %> these.
    <% else %> - <%= bootstrap_pagination @registrations %> - - <%= datagrid_header @registrationsgrid %> - <%= datagrid_rows @registrationsgrid, @registrations %> + <%= bootstrap_pagination @tickets %> +
    + <%= datagrid_header @ticketsgrid %> + <%= datagrid_rows @ticketsgrid, @tickets %>
    - <%= bootstrap_pagination @registrations %> + <%= bootstrap_pagination @tickets %> <% end %>
    -<%= render partial: 'registrations/email_modal' %> -<%= render partial: 'registrations/upload_modal' %> -<%= render partial: 'registrations/info_modal' %> -<%= render partial: 'registrations/filter_modal' %> +<%= render partial: 'tickets/email_modal' %> +<%= render partial: 'tickets/info_modal' %> +<%= render partial: 'tickets/filter_modal' %> diff --git a/app/views/tickets/info.js.erb b/app/views/tickets/info.js.erb new file mode 100644 index 00000000..08382097 --- /dev/null +++ b/app/views/tickets/info.js.erb @@ -0,0 +1,2 @@ +$('#info-modal .modal-body').html("<%= j render partial: 'tickets/info_content' %>"); +$('#info-modal').modal('show'); diff --git a/app/views/tickets/resend.js.erb b/app/views/tickets/resend.js.erb new file mode 100644 index 00000000..022eaba7 --- /dev/null +++ b/app/views/tickets/resend.js.erb @@ -0,0 +1 @@ +alert("Ticket mail resend succesfully"); diff --git a/app/views/tickets/update.js.erb b/app/views/tickets/update.js.erb new file mode 100644 index 00000000..86083a3b --- /dev/null +++ b/app/views/tickets/update.js.erb @@ -0,0 +1,2 @@ +$("#flash").replaceWith("<%= escape_javascript render partial: 'flash' %>") +$("#<%= dom_id(@ticket) %>").replaceWith("<%= escape_javascript render partial: 'ticket', locals: { ticket: @ticket } %>") diff --git a/app/views/zones/_form.html.erb b/app/views/zones/_form.html.erb deleted file mode 100644 index 50bd69ea..00000000 --- a/app/views/zones/_form.html.erb +++ /dev/null @@ -1,4 +0,0 @@ -<%= form_for [@event, @event.zones.build], remote: true do |f| %> - <%= form_text_field f, :name %> - <%= f.button :submit, class: 'btn btn-group btn-primary' %> -<% end %> diff --git a/app/views/zones/_zone.html.erb b/app/views/zones/_zone.html.erb deleted file mode 100644 index c918166f..00000000 --- a/app/views/zones/_zone.html.erb +++ /dev/null @@ -1,4 +0,0 @@ - - <%= zone.name %> - <%= link_to raw(''), event_zone_path(zone.event, zone), confirm: 'Are you sure? Removing a zone will remove this zone from all registration and cannot be undone!', remote: true, method: :delete %> - diff --git a/app/views/zones/create.js.erb b/app/views/zones/create.js.erb deleted file mode 100644 index 23de4b6d..00000000 --- a/app/views/zones/create.js.erb +++ /dev/null @@ -1,2 +0,0 @@ -$("<%= escape_javascript render @zone %>").appendTo("#table-zones"); -$("#new_zone")[0].reset(); diff --git a/app/views/zones/destroy.js.erb b/app/views/zones/destroy.js.erb deleted file mode 100644 index 812f057d..00000000 --- a/app/views/zones/destroy.js.erb +++ /dev/null @@ -1 +0,0 @@ -$("#zone-<%= @id %>").remove(); diff --git a/app/views/zones/index.html.erb b/app/views/zones/index.html.erb deleted file mode 100644 index 5f866a5e..00000000 --- a/app/views/zones/index.html.erb +++ /dev/null @@ -1,23 +0,0 @@ -<%= render partial: "events/tabs" %> - -
    -
    -

    Manage Event Zones

    -
    - - - - - - <%= render @event.zones %> -
    NameActions
    -
    -
    -
    - -
    -
    -

    Add Zone

    - <%= render "zones/form" %> -
    -
    diff --git a/config/application.rb b/config/application.rb index 3e513a06..4d20a1ed 100644 --- a/config/application.rb +++ b/config/application.rb @@ -19,5 +19,9 @@ class Application < Rails::Application # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] # config.i18n.default_locale = :de + # + config.active_job.queue_adapter = :delayed_job + + config.active_record.raise_in_transactional_callbacks = true end end diff --git a/config/deploy.rb b/config/deploy.rb index b6510458..a9d8b9ab 100644 --- a/config/deploy.rb +++ b/config/deploy.rb @@ -12,7 +12,7 @@ set :deploy_to, '/home/gandalf/production' # Default value for :linked_files is [] -set :linked_files, %w{config/database.yml config/initializers/secret_token.rb} +set :linked_files, %w{config/database.yml config/secrets.yml} # Default value for linked_dirs is [] set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system} diff --git a/config/environments/test.rb b/config/environments/test.rb index 9d21672d..90ee23b0 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -13,7 +13,7 @@ config.eager_load = false # Configure static asset server for tests with Cache-Control for performance. - config.serve_static_assets = true + config.serve_static_files = true config.static_cache_control = "public, max-age=3600" # Show full error reports and disable caching. @@ -33,4 +33,7 @@ # Print deprecation notices to the stderr. config.active_support.deprecation = :stderr + + # Randomize test order + config.active_support.test_order = :random end diff --git a/config/initializers/mute_papertrail_deprecation_warnings.rb b/config/initializers/mute_papertrail_deprecation_warnings.rb new file mode 100644 index 00000000..10a2ed4e --- /dev/null +++ b/config/initializers/mute_papertrail_deprecation_warnings.rb @@ -0,0 +1,5 @@ +current_behavior = ActiveSupport::Deprecation.behavior +ActiveSupport::Deprecation.behavior = lambda do |message, callstack| + return if message =~ /`serialized_attributes` is deprecated without replacement/ && callstack.any? { |m| m =~ /paper_trail/ } + Array.wrap(current_behavior).each { |behavior| behavior.call(message, callstack) } +end diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb deleted file mode 100644 index c27852a6..00000000 --- a/config/initializers/secret_token.rb +++ /dev/null @@ -1,17 +0,0 @@ -# Be sure to restart your server when you modify this file. - -# Your secret key is used for verifying the integrity of signed cookies. -# If you change this key, all old signed cookies will become invalid! - -# Make sure the secret is at least 30 characters and all random, -# no regular words or you'll be exposed to dictionary attacks. -# You can use `rake secret` to generate a secure secret key. - -# Make sure your secret_key_base is kept private -# if you're sharing your code publicly. -# -Isengard::Application.config.secret_key_base = 'a27fcd9aa2eabd14030493d6b5a1521ba09c9d23a1dd90b3c9d6914b8d226d1df8b46af3005f73a29c3ef1acd86de3669fbe08605d9ce8da73856c734f8a0e36' -Isengard::Application.config.fk_auth_url = 'http://fkgent.be/api_isengard_v2.php' -Isengard::Application.config.fk_auth_salt = '#development#' -Isengard::Application.config.fk_auth_key = '#development#' -Isengard::Application.config.enrollment_key = '#development#' diff --git a/config/routes.rb b/config/routes.rb index 22935945..a4300ee1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,20 +1,9 @@ Isengard::Application.routes.draw do devise_for :partners devise_for :users - # The priority is based upon order of creation: first created -> highest priority. - # See how all your routes lay out with "rake routes". - # You can have the root of your site routed with "root" root 'welcome#index' - # Example of regular route: - # get 'products/:id' => 'catalog#view' - - # Example of named route that can be invoked with purchase_url(id: product.id) - # get 'products/:id/purchase' => 'catalog#purchase', as: :purchase - - # Example resource route (maps HTTP verbs to controller actions automatically): - # resources :products resources :events do member do get 'export_status' @@ -22,35 +11,43 @@ post 'toggle_registration_open' end - resources :zones resources :access_levels do - resources :zones member do get 'toggle_visibility' end end resources :role_names - resources :registrations do + + member do + get 'statistics' + get 'scan' + post 'check_in' + end + + resources :tickets do member do get 'resend' get 'info' end collection do - post 'basic' - post 'advanced' - post 'upload' post 'email' end end - member do - get 'statistics' - get 'scan' - post 'check_in' - end + resources :orders do + member do + get 'resend' + get 'info' + end - resources :periods + resources :build, controller: 'orders/build' + + collection do + post 'upload' + post 'email' + end + end resources :partners do member do @@ -69,46 +66,4 @@ end end end - - patch "events/:event_id/access_level/:access_level_id/set_zones", to: "access_levels#set_zones", as: "set_zones_for_access_level" - - # Example resource route with options: - # resources :products do - # member do - # get 'short' - # post 'toggle' - # end - # - # collection do - # get 'sold' - # end - # end - - # Example resource route with sub-resources: - # resources :products do - # resources :comments, :sales - # resource :seller - # end - - # Example resource route with more complex sub-resources: - # resources :products do - # resources :comments - # resources :sales do - # get 'recent', on: :collection - # end - # end - - # Example resource route with concerns: - # concern :toggleable do - # post 'toggle' - # end - # resources :posts, concerns: :toggleable - # resources :photos, concerns: :toggleable - - # Example resource route within a namespace: - # namespace :admin do - # # Directs /admin/products/* to Admin::ProductsController - # # (app/controllers/admin/products_controller.rb) - # resources :products - # end end diff --git a/config/secrets.yml b/config/secrets.yml new file mode 100644 index 00000000..703050f1 --- /dev/null +++ b/config/secrets.yml @@ -0,0 +1,20 @@ +development: + secret_key_base: '95182ec21cccb3c5ca9425bb8a45ec9327ae7e33e857395b689f38fc6d801e1185c7abb662190c2b8512f05e8087f0bab0f604f802b4c631431811b5b1d32a29' + fk_auth_url: 'http://fkgent.be/api_isengard_v2.php' + fk_auth_salt: '#development#' + fk_auth_key: '#development#' + enrolment_key: '#development#' + +test: + secret_key_base: '95182ec21cccb3c5ca9425bb8a45ec9327ae7e33e857395b689f38fc6d801e1185c7abb662190c2b8512f05e8087f0bab0f604f802b4c631431811b5b1d32a29' + fk_auth_url: 'http://fkgent.be/api_isengard_v2.php' + fk_auth_salt: '#development#' + fk_auth_key: '#development#' + enrolment_key: '#development#' + +production: + secret_key_base: 'a27fcd9aa2eabd14030493d6b5a1521ba09c9d23a1dd90b3c9d6914b8d226d1df8b46af3005f73a29c3ef1acd86de3669fbe08605d9ce8da73856c734f8a0e36' + fk_auth_url: 'http://fkgent.be/api_isengard_v2.php' + fk_auth_salt: '#development#' + fk_auth_key: '#development#' + enrolment_key: '#development#' diff --git a/db/migrate/20140910112715_create_orders.rb b/db/migrate/20140910112715_create_orders.rb new file mode 100644 index 00000000..6d814a5a --- /dev/null +++ b/db/migrate/20140910112715_create_orders.rb @@ -0,0 +1,16 @@ +class CreateOrders < ActiveRecord::Migration + def change + create_table :orders do |t| + t.string :status + t.string :name + t.string :email + t.string :gsm + t.integer :ticket_id + t.references :event, index: true + t.integer :paid + t.integer :price + + t.timestamps + end + end +end diff --git a/db/migrate/20140910115332_create_tickets.rb b/db/migrate/20140910115332_create_tickets.rb new file mode 100644 index 00000000..04a7f07d --- /dev/null +++ b/db/migrate/20140910115332_create_tickets.rb @@ -0,0 +1,18 @@ +class CreateTickets < ActiveRecord::Migration + def change + create_table :tickets do |t| + t.string :name + t.string :email + t.string :gsm + t.datetime :checked_in_at + t.references :event, index: true + t.references :order, index: true + t.string :student_number + t.text :comment + t.string :barcode + t.string :barcode_data + + t.timestamps + end + end +end diff --git a/db/migrate/20140910120108_add_access_level_to_ticket.rb b/db/migrate/20140910120108_add_access_level_to_ticket.rb new file mode 100644 index 00000000..963c7e16 --- /dev/null +++ b/db/migrate/20140910120108_add_access_level_to_ticket.rb @@ -0,0 +1,5 @@ +class AddAccessLevelToTicket < ActiveRecord::Migration + def change + add_reference :tickets, :access_level, index: true + end +end diff --git a/db/migrate/20140910120947_delete_unnecessary_tables.rb b/db/migrate/20140910120947_delete_unnecessary_tables.rb new file mode 100644 index 00000000..1fc23ba1 --- /dev/null +++ b/db/migrate/20140910120947_delete_unnecessary_tables.rb @@ -0,0 +1,8 @@ +class DeleteUnnecessaryTables < ActiveRecord::Migration + def change + drop_table :zones + drop_table :accesses + drop_table :periods + drop_table :included_zones + end +end diff --git a/db/migrate/20140910154441_add_payment_code_to_orders.rb b/db/migrate/20140910154441_add_payment_code_to_orders.rb new file mode 100644 index 00000000..63d4185f --- /dev/null +++ b/db/migrate/20140910154441_add_payment_code_to_orders.rb @@ -0,0 +1,5 @@ +class AddPaymentCodeToOrders < ActiveRecord::Migration + def change + add_column :orders, :payment_code, :string + end +end diff --git a/db/migrate/20140911145421_add_status_to_ticket.rb b/db/migrate/20140911145421_add_status_to_ticket.rb new file mode 100644 index 00000000..6fe12c34 --- /dev/null +++ b/db/migrate/20140911145421_add_status_to_ticket.rb @@ -0,0 +1,5 @@ +class AddStatusToTicket < ActiveRecord::Migration + def change + add_column :tickets, :status, :string + end +end diff --git a/db/migrate/20140911145549_remove_gsm_from_ticket.rb b/db/migrate/20140911145549_remove_gsm_from_ticket.rb new file mode 100644 index 00000000..ac9fa0eb --- /dev/null +++ b/db/migrate/20140911145549_remove_gsm_from_ticket.rb @@ -0,0 +1,5 @@ +class RemoveGsmFromTicket < ActiveRecord::Migration + def change + remove_column :tickets, :gsm, :string + end +end diff --git a/db/migrate/20140912063651_add_default_to_status_columns.rb b/db/migrate/20140912063651_add_default_to_status_columns.rb new file mode 100644 index 00000000..25d0a82a --- /dev/null +++ b/db/migrate/20140912063651_add_default_to_status_columns.rb @@ -0,0 +1,6 @@ +class AddDefaultToStatusColumns < ActiveRecord::Migration + def change + change_column :tickets, :status, :string, default: 'initial' + change_column :orders, :status, :string, default: 'initial' + end +end diff --git a/db/migrate/20140913142443_remove_event_from_ticket.rb b/db/migrate/20140913142443_remove_event_from_ticket.rb new file mode 100644 index 00000000..38339227 --- /dev/null +++ b/db/migrate/20140913142443_remove_event_from_ticket.rb @@ -0,0 +1,5 @@ +class RemoveEventFromTicket < ActiveRecord::Migration + def change + remove_reference :tickets, :event, index: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 6817af37..bae87309 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,16 +11,16 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20140910122923) do +ActiveRecord::Schema.define(version: 20140913142443) do - create_table "access_levels", force: true do |t| - t.string "name" + create_table "access_levels", force: :cascade do |t| + t.string "name", limit: 255 t.integer "event_id" t.datetime "created_at" t.datetime "updated_at" t.integer "capacity" t.integer "price" - t.boolean "public", default: true + t.boolean "public", default: true t.boolean "has_comment" t.boolean "hidden" t.boolean "member_only" @@ -28,53 +28,41 @@ add_index "access_levels", ["event_id"], name: "index_access_levels_on_event_id" - create_table "access_levels_promos", id: false, force: true do |t| + create_table "access_levels_promos", id: false, force: :cascade do |t| t.integer "promo_id", null: false t.integer "access_level_id", null: false end - create_table "accesses", force: true do |t| - t.integer "period_id" - t.integer "registration_id" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "access_level_id" - end - - add_index "accesses", ["access_level_id"], name: "index_accesses_on_access_level_id" - add_index "accesses", ["period_id"], name: "index_accesses_on_period_id" - add_index "accesses", ["registration_id"], name: "index_accesses_on_registration_id" - - create_table "clubs", force: true do |t| - t.string "full_name" - t.string "internal_name" - t.string "display_name" + create_table "clubs", force: :cascade do |t| + t.string "full_name", limit: 255 + t.string "internal_name", limit: 255 + t.string "display_name", limit: 255 t.datetime "created_at" t.datetime "updated_at" end - create_table "clubs_users", id: false, force: true do |t| + create_table "clubs_users", id: false, force: :cascade do |t| t.integer "club_id" t.integer "user_id" end - create_table "delayed_jobs", force: true do |t| - t.integer "priority", default: 0, null: false - t.integer "attempts", default: 0, null: false - t.text "handler", null: false + create_table "delayed_jobs", force: :cascade do |t| + t.integer "priority", default: 0, null: false + t.integer "attempts", default: 0, null: false + t.text "handler", null: false t.text "last_error" t.datetime "run_at" t.datetime "locked_at" t.datetime "failed_at" - t.string "locked_by" - t.string "queue" + t.string "locked_by", limit: 255 + t.string "queue", limit: 255 t.datetime "created_at" t.datetime "updated_at" end add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority" - create_table "enrolled_clubs_members", id: false, force: true do |t| + create_table "enrolled_clubs_members", id: false, force: :cascade do |t| t.integer "club_id", null: false t.integer "user_id", null: false end @@ -82,55 +70,61 @@ add_index "enrolled_clubs_members", ["club_id"], name: "index_enrolled_clubs_members_on_club_id" add_index "enrolled_clubs_members", ["user_id"], name: "index_enrolled_clubs_members_on_user_id" - create_table "events", force: true do |t| - t.string "name" + create_table "events", force: :cascade do |t| + t.string "name", limit: 255 t.datetime "start_date" t.datetime "end_date" - t.string "location" - t.string "website" + t.string "location", limit: 255 + t.string "website", limit: 255 t.text "description" t.datetime "created_at" t.datetime "updated_at" t.datetime "registration_open_date" t.datetime "registration_close_date" - t.string "bank_number" - t.boolean "show_ticket_count", default: true - t.string "contact_email" - t.string "export_file_name" - t.string "export_content_type" + t.string "bank_number", limit: 255 + t.boolean "show_ticket_count", default: true + t.string "contact_email", limit: 255 + t.string "export_file_name", limit: 255 + t.string "export_content_type", limit: 255 t.integer "export_file_size" t.datetime "export_updated_at" t.boolean "show_statistics" - t.string "export_status" + t.string "export_status", limit: 255 t.integer "club_id" - t.boolean "registration_open", default: true + t.boolean "registration_open", default: true end - create_table "included_zones", force: true do |t| - t.integer "zone_id" - t.integer "access_level_id" + create_table "orders", force: :cascade do |t| + t.string "status", default: "initial" + t.string "name" + t.string "email" + t.string "gsm" + t.integer "ticket_id" + t.integer "event_id" + t.integer "paid" + t.integer "price" t.datetime "created_at" t.datetime "updated_at" + t.string "payment_code" end - add_index "included_zones", ["access_level_id"], name: "index_included_zones_on_access_level_id" - add_index "included_zones", ["zone_id"], name: "index_included_zones_on_zone_id" + add_index "orders", ["event_id"], name: "index_orders_on_event_id" - create_table "partners", force: true do |t| - t.string "name" - t.string "email" - t.string "authentication_token" + create_table "partners", force: :cascade do |t| + t.string "name", limit: 255 + t.string "email", limit: 255 + t.string "authentication_token", limit: 255 t.datetime "created_at" t.datetime "updated_at" - t.string "encrypted_password", default: "", null: false - t.string "reset_password_token" + t.string "encrypted_password", limit: 255, default: "", null: false + t.string "reset_password_token", limit: 255 t.datetime "reset_password_sent_at" t.datetime "remember_created_at" - t.integer "sign_in_count", default: 0, null: false + t.integer "sign_in_count", default: 0, null: false t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" - t.string "current_sign_in_ip" - t.string "last_sign_in_ip" + t.string "current_sign_in_ip", limit: 255 + t.string "last_sign_in_ip", limit: 255 t.integer "event_id" t.integer "access_level_id" t.boolean "confirmed" @@ -140,72 +134,79 @@ add_index "partners", ["authentication_token"], name: "index_partners_on_authentication_token" add_index "partners", ["reset_password_token"], name: "index_partners_on_reset_password_token", unique: true - create_table "periods", force: true do |t| - t.datetime "starts" - t.datetime "ends" - t.string "name" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "event_id" - end - - add_index "periods", ["event_id"], name: "index_periods_on_event_id" - - create_table "promos", force: true do |t| + create_table "promos", force: :cascade do |t| t.integer "event_id" - t.string "code" + t.string "code", limit: 255 t.integer "limit" t.datetime "created_at" t.datetime "updated_at" - t.integer "sold_tickets", default: 0 + t.integer "sold_tickets", default: 0 end add_index "promos", ["event_id"], name: "index_promos_on_event_id" - create_table "registrations", force: true do |t| - t.string "barcode" - t.string "name" - t.string "email" + create_table "registrations", force: :cascade do |t| + t.string "barcode", limit: 255 + t.string "name", limit: 255 + t.string "email", limit: 255 t.datetime "created_at" t.datetime "updated_at" t.integer "event_id" t.integer "paid" - t.string "student_number" + t.string "student_number", limit: 255 t.integer "price" t.datetime "checked_in_at" t.text "comment" - t.string "barcode_data" - t.string "payment_code" + t.string "barcode_data", limit: 255 + t.string "payment_code", limit: 255 end add_index "registrations", ["event_id"], name: "index_registrations_on_event_id" add_index "registrations", ["payment_code"], name: "index_registrations_on_payment_code", unique: true - create_table "users", force: true do |t| - t.string "username", default: "", null: false + create_table "tickets", force: :cascade do |t| + t.string "name" + t.string "email" + t.datetime "checked_in_at" + t.integer "order_id" + t.string "student_number" + t.text "comment" + t.string "barcode" + t.string "barcode_data" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "access_level_id" + t.string "status", default: "initial" + end + + add_index "tickets", ["access_level_id"], name: "index_tickets_on_access_level_id" + add_index "tickets", ["order_id"], name: "index_tickets_on_order_id" + + create_table "users", force: :cascade do |t| + t.string "username", limit: 255, default: "", null: false t.datetime "remember_created_at" - t.integer "sign_in_count", default: 0, null: false + t.integer "sign_in_count", default: 0, null: false t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" - t.string "current_sign_in_ip" - t.string "last_sign_in_ip" + t.string "current_sign_in_ip", limit: 255 + t.string "last_sign_in_ip", limit: 255 t.datetime "created_at" t.datetime "updated_at" - t.string "cas_givenname" - t.string "cas_surname" - t.string "cas_ugentStudentID" - t.string "cas_mail" - t.string "cas_uid" + t.string "cas_givenname", limit: 255 + t.string "cas_surname", limit: 255 + t.string "cas_ugentStudentID", limit: 255 + t.string "cas_mail", limit: 255 + t.string "cas_uid", limit: 255 t.boolean "admin" end add_index "users", ["username"], name: "index_users_on_username", unique: true - create_table "versions", force: true do |t| - t.string "item_type", null: false - t.integer "item_id", null: false - t.string "event", null: false - t.string "whodunnit" + create_table "versions", force: :cascade do |t| + t.string "item_type", limit: 255, null: false + t.integer "item_id", null: false + t.string "event", limit: 255, null: false + t.string "whodunnit", limit: 255 t.text "object" t.datetime "created_at" t.text "object_changes" @@ -213,14 +214,4 @@ add_index "versions", ["item_type", "item_id"], name: "index_versions_on_item_type_and_item_id" - create_table "zones", force: true do |t| - t.string "name" - t.integer "event_id" - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "zones", ["event_id"], name: "index_zones_on_event_id" - add_index "zones", ["name", "event_id"], name: "index_zones_on_name_and_event_id", unique: true - end diff --git a/test/controllers/event_controller_test.rb b/test/controllers/event_controller_test.rb index 0a66f51a..37bdad8e 100644 --- a/test/controllers/event_controller_test.rb +++ b/test/controllers/event_controller_test.rb @@ -76,33 +76,26 @@ def setup end test "show unpaid for checked in unpaid tickets" do - reg = registrations(:one) - reg.checked_in_at = Time.now - reg.price = 10 - reg.save - - post :check_in, id: events(:codenight).id, code: '1234567891231' + post :check_in, id: events(:codenight).id, code: '3333333333333' assert_response :success - assert_nil(@registration) + assert_nil(@ticket) assert(flash[:warning].include? "Person has not paid yet!") end - test "dont find registrations from other event" do + test "dont find tickets from other event" do post :check_in, id: events(:codenight).id, code: '2222222222222' assert_response :success - assert_nil(@registration) + assert_nil(@ticket) end test "dont check in unpaid tickets" do - sign_out users(:tom) - sign_in users(:maarten) - post :check_in, id: events(:galabal).id, code: '2222222222222' + post :check_in, id: events(:codenight).id, code: '2222222222222' assert_response :success assert(flash[:warning].include? "Person has not paid yet!") end test "scan page should include check digit" do - post :check_in, id: events(:codenight), code: '1234567891231' + post :check_in, id: events(:codenight).id, code: '1234567891231' assert_response :success # expect at least one with value "Barcode:" and the full code with checkdigit assert_select "tr" do @@ -112,57 +105,57 @@ def setup end - test "member tickets should not be shown for wrong user" do - sign_out users(:tom) - get :show, id: events(:codenight).id - assert_response :success - - assert assigns(:event) - assert_select "#registration_access_levels" do - assert_select "option", count: 1, text: "Lid" - assert_select "option", count: 1, text: "Unlimited" - assert_select "option", count: 0, text: "Member Only" - end - end - - test "member tickets should be shown for enrolled user" do - sign_out users(:tom) - sign_in users(:matthias) - assert users(:matthias).enrolled_clubs.include? clubs(:zeus) - get :show, id: events(:codenight).id - - assert_response :success - - assert_select "#registration_access_levels" do - assert_select "option", count: 1, text: "Lid" - assert_select "option", count: 1, text: "Unlimited" - assert_select "option", count: 1, text: "Member" - end - - end - - test "registration form hidden when only member or hidden tickets available" do - get :show, id: events(:twaalfurenloop).id - assert_select "#basic-registration-form", false, "Should not contain registration form" - end - - test "registration form shown when a ticket is available" do - get :show, id: events(:codenight).id - assert_select "#basic-registration-form", true, "Should contain registration form" - end - - test "do statistics" do - date = "#{registrations(:one).created_at.to_date}" - get :statistics, { id: 1 } - assert_response :success - assert assigns(:data) == [ - { name: "Lid", data: { date => 1 } }, - { name: "Limited0", data: { date => 3 } }, - { name: "Limited1", data: { date => 3 } }, - { name: "Limited2", data: { date => 3 } }, - { name: "Member", data: { date => 0 } }, - { name: "Unlimited", data: { date => 0 } } - ], "Got #{assigns(:data).inspect} on #{date}" - end + # test "member tickets should not be shown for wrong user" do + # sign_out users(:tom) + # get :show, id: events(:codenight).id + # assert_response :success + + # assert assigns(:event) + # assert_select "#ticket_access_levels" do + # assert_select "option", count: 1, text: "Lid" + # assert_select "option", count: 1, text: "Unlimited" + # assert_select "option", count: 0, text: "Member Only" + # end + # end + + # test "member tickets should be shown for enrolled user" do + # sign_out users(:tom) + # sign_in users(:matthias) + # assert users(:matthias).enrolled_clubs.include? clubs(:zeus) + # get :show, id: events(:codenight).id + + # assert_response :success + + # assert_select "#ticket_access_levels" do + # assert_select "option", count: 1, text: "Lid" + # assert_select "option", count: 1, text: "Unlimited" + # assert_select "option", count: 1, text: "Member" + # end + + # end + + # test "ticket form hidden when only member or hidden tickets available" do + # get :show, id: events(:twaalfurenloop).id + # assert_select "#basic-registration-form", false, "Should not contain registration form" + # end + + # test "registration form shown when a ticket is available" do + # get :show, id: events(:codenight).id + # assert_select "#basic-registration-form", true, "Should contain registration form" + # end + + # test "do statistics" do + # date = "#{registrations(:one).created_at.to_date}" + # get :statistics, { id: events(:codenight) } + # assert_response :success + # assert assigns(:data) == [ + # { name: "Lid", data: { date => 1 } }, + # { name: "Limited0", data: { date => 3 } }, + # { name: "Limited1", data: { date => 3 } }, + # { name: "Limited2", data: { date => 3 } }, + # { name: "Member", data: { date => 0 } }, + # { name: "Unlimited", data: { date => 0 } } + # ], "Got #{assigns(:data).inspect} on #{date}" + # end end diff --git a/test/controllers/included_zones_controller_test.rb b/test/controllers/included_zones_controller_test.rb deleted file mode 100644 index 7dd1bc4c..00000000 --- a/test/controllers/included_zones_controller_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class IncludedZonesControllerTest < ActionController::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/controllers/orders_controller_test.rb b/test/controllers/orders_controller_test.rb new file mode 100644 index 00000000..ff254700 --- /dev/null +++ b/test/controllers/orders_controller_test.rb @@ -0,0 +1,172 @@ +require 'test_helper' + +class OrdersControllerTest < ActionController::TestCase + include Devise::TestHelpers + + def setup + stub_request(:get, "http://fkgent.be/api_isengard_v2.php"). + with(query: hash_including(u: "")).to_return(body: 'FAIL') + + sign_in users(:tom) + end + + test "uploading partially failed orders" do + + # Quick check for the used fixture + three = orders(:three) + assert_equal 0, three.paid + + assert_difference "ActionMailer::Base.deliveries.size", +1 do + # Posting the csv file + post :upload, { + event_id: events(:codenight), + separator: ';', + amount_column: 'Amount', + csv_file: fixture_file_upload('files/unsuccesful_registration_payments.csv') } + end + + # Check if the correct rows failed. + assert_not_nil assigns(:csvfails) + assigns(:csvfails).each do |csvfail| + assert_match(/FAIL.*/, csvfail.to_s) + end + + # Check if the flash is correct + assert_equal 'Updated 1 payment successfully.', flash[:success] + assert_equal 'The rows listed below contained an invalid code, please fix them by hand.', flash[:error] + + # Check if the success registration got changed. + assert_equal 0.01, three.reload.paid + + end + + test "resend actuallly sends an email" do + assert_difference "ActionMailer::Base.deliveries.size", orders(:one).tickets.count do + xhr :get, :resend, event_id: events(:codenight), id: orders(:one).id + end + end + + test "resend sends order email when !is_paid" do + assert_difference "ActionMailer::Base.deliveries.size", +1 do + xhr :get, :resend, event_id: events(:codenight), id: orders(:three).id + end + + email = ActionMailer::Base.deliveries.last + assert_match(/Order for/, email.subject) + end + + test "resend sends ticket emails when is_paid" do + assert_difference "ActionMailer::Base.deliveries.size", orders(:free).tickets.count do + xhr :get, :resend, event_id: events(:codenight), id: orders(:free).id + end + + email = ActionMailer::Base.deliveries.last + assert_match(/Ticket for/, email.subject) + end + + test "manual full paying works" do + a = orders(:non_free_not_paid) + b = orders(:non_free_partially_paid) + + assert_equal 0, a.paid + assert_equal 0.05, b.paid + + [a, b].each do |order| + assert_difference "ActionMailer::Base.deliveries.size", order.tickets.count do + xhr :put, :update, { + event_id: order.event.id, + id: order.id, + order: { to_pay: 0 } + }, remote: true + end + assert_equal order.price, order.reload.paid + email = ActionMailer::Base.deliveries.last + assert_match(/Ticket for/, email.subject) + end + + end + + test "manual partial paying works" do + a = orders(:non_free_not_paid) + b = orders(:non_free_partially_paid) + + assert_equal 0, a.paid + assert_equal 0.05, b.paid + + to_pay = 0.01 + + [a, b].each do |order| + assert_difference "ActionMailer::Base.deliveries.size", +1 do + xhr :put, :update, { + event_id: order.event.id, + id: order.id, + order: { to_pay: to_pay } + }, remote: true + end + assert order.price > order.reload.paid + email = ActionMailer::Base.deliveries.last + assert_match(/Order for/, email.subject) + end + + end + + test "manual overpaying works" do + a = orders(:non_free_not_paid) + b = orders(:non_free_partially_paid) + + assert_equal 0, a.paid + assert_equal 0.05, b.paid + + to_pay = -5 + + [a, b].each do |order| + # +1 here for the overpayment email + assert_difference "ActionMailer::Base.deliveries.size", order.tickets.count+1 do + xhr :put, :update, { + event_id: order.event.id, + id: order.id, + order: { to_pay: to_pay } + }, remote: true + end + assert order.price < order.reload.paid + + email = ActionMailer::Base.deliveries[-2] + assert_match(/Ticket for/, email.subject) + + email = ActionMailer::Base.deliveries[-1] + assert_match(/Overpayment for/, email.subject) + end + + end + + + test "manual not changing mails nor changes the code" do + three = orders(:three) + four = orders(:four) + + assert_equal 0, three.paid + assert_equal 0.05, four.paid + + [three, four].each do |order| + paid, code = order.paid, order.payment_code + assert_no_difference "ActionMailer::Base.deliveries.size" do + xhr :put, :update, { + event_id: order.event.id, + id: order.id, + order: { to_pay: order.to_pay } + }, remote: true + end + assert_equal paid, order.reload.paid + assert_equal code, order.reload.payment_code + end + end + + test "admins can manage orders from other events" do + user = users(:adminfelix) + ability = Ability.new(user) + + r = orders(:two) + assert ability.can?(:manage, r) + end + +end diff --git a/test/controllers/partners_controller_test.rb b/test/controllers/partners_controller_test.rb index bff028fd..d293fd60 100644 --- a/test/controllers/partners_controller_test.rb +++ b/test/controllers/partners_controller_test.rb @@ -8,48 +8,48 @@ def setup test "should get index" do sign_in users(:tom) - get :index, event_id: 1 + get :index, event_id: events(:codenight) assert_response :success end test "should get show for authenticated partners" do sign_in partners(:KBC) - get :show, event_id: 1, id: 1 + get :show, event_id: events(:codenight), id: partners(:KBC) assert_response :success end test "should not get show for not authenticated partners" do - get :show, event_id: 1, id: 1 + get :show, event_id: events(:codenight), id: partners(:KBC) assert_response :redirect end test "should not get show for other partners" do sign_in partners(:KBC) - get :show, event_id: 1, id: 2 + get :show, event_id: events(:codenight), id: partners(:Zeus) assert_response :redirect end test "should not get show for other events" do sign_in partners(:KBC) - get :show, event_id: 2, id: 1 + get :show, event_id: events(:galabal), id: partners(:KBC) assert_response :redirect end test "should confirm" do sign_in partners(:KBC) - get :show, event_id: 1, id: 1 + get :show, event_id: events(:codenight), id: partners(:KBC) assert_response :success end test "should not confirm for other partners" do sign_in partners(:KBC) - post :confirm, event_id: 1, id: 2 + post :confirm, event_id: events(:codenight), id: partners(:Zeus) assert_response :redirect end test "should not confirm for other events" do sign_in partners(:KBC) - post :confirm, event_id: 2, id: 1 + post :confirm, event_id: events(:galabal), id: partners(:KBC) assert_response :redirect end @@ -60,50 +60,50 @@ def setup sign_in(p) - get :show, event_id: 1, id: 1 + get :show, event_id: events(:codenight), id: partners(:KBC) assert_select "a", text: "You have already registered for this event." end test "should not allow another registration on confirm when already confirmed" do - assert_difference "Event.find_by_name(events(:codenight).name).registrations.count", +0 do + assert_difference "Event.find_by_name(events(:codenight).name).tickets.count", +0 do p = partners(:KBC) p.confirmed = true p.save sign_in(p) - xhr :post, :confirm, event_id: 1, id: 1 + xhr :post, :confirm, event_id: events(:codenight), id: partners(:KBC) end end test "should send registration mail on confirm" do assert_difference "ActionMailer::Base.deliveries.size", +1 do sign_in partners(:KBC) - xhr :post, :confirm, event_id: 1, id: 1 + xhr :post, :confirm, event_id: events(:codenight), id: partners(:KBC) end end test "should add registration on confirm" do - assert_difference "Event.find_by_name(events(:codenight).name).registrations.count", +1 do + assert_difference "Event.find_by_name(events(:codenight).name).tickets.count", +1 do sign_in partners(:KBC) - xhr :post, :confirm, event_id: 1, id: 1 + xhr :post, :confirm, event_id: events(:codenight), id: partners(:KBC) end end test "should confirm correct access level for correct event" do p = partners(:KBC) - assert_difference "Event.find_by_name(events(:codenight).name).registrations.count", +1 do + assert_difference "Event.find_by_name(events(:codenight).name).tickets.count", +1 do sign_in p - xhr :post, :confirm, event_id: 1, id: 1 + xhr :post, :confirm, event_id: events(:codenight), id: partners(:KBC) end # Get latest registration here - r = Registration.find_by_name "KBC" + r = Ticket.find_by_name "KBC" assert r.name = p.name assert r.email = p.email - assert r.event_id = p.event_id - assert r.price = p.access_level.price + assert r.event = p.event + assert r.order.price = p.access_level.price end end diff --git a/test/controllers/periods_controller_test.rb b/test/controllers/periods_controller_test.rb deleted file mode 100644 index ae6baa26..00000000 --- a/test/controllers/periods_controller_test.rb +++ /dev/null @@ -1,51 +0,0 @@ -require 'test_helper' - -class PeriodsControllerTest < ActionController::TestCase - include Devise::TestHelpers - - test "creation forces login" do - - post :create, { - event_id: 2, - period: { - name: 'Periods 1', - starts: '2013-09-17 20:09:09', - ends: '2013-09-17 20:09:09' - } - }, format: 'js' - - assert_redirected_to new_user_session_path - end - - test "creation requires event crud" do - sign_in users(:tom) - - post :create, { - event_id: 2, - period: { - name: 'Periods 2', - starts: '2013-09-17 20:09:09', - ends: '2013-09-17 20:09:09' - } - }, format: 'js' - - assert_redirected_to root_path - assert_not flash[:error].empty? - end - - test "creation works" do - sign_in users(:tom) - - post :create, { - format: :js, - event_id: 1, - period: { - name: 'Periods 3', - starts: '2013-09-17 20:09:09', - ends: '2013-09-17 20:09:09' - } - } - - assert_response :success - end -end diff --git a/test/controllers/registrations_controller_test.rb b/test/controllers/registrations_controller_test.rb index b2563413..3571cdd0 100644 --- a/test/controllers/registrations_controller_test.rb +++ b/test/controllers/registrations_controller_test.rb @@ -1,193 +1,7 @@ require 'test_helper' class RegistrationsControllerTest < ActionController::TestCase - include Devise::TestHelpers - - def setup - stub_request(:get, "http://fkgent.be/api_isengard_v2.php"). - with(query: hash_including(u: "")).to_return(body: 'FAIL') - - sign_in users(:tom) - end - - test "uploading partially failed registrations" do - - # Quick check for the used fixture - three = registrations(:three) - assert_equal 0, three.paid - - assert_difference "ActionMailer::Base.deliveries.size", +1 do - # Posting the csv file - post :upload, { - event_id: 1, - separator: ';', - amount_column: 'Amount', - csv_file: fixture_file_upload('files/unsuccesful_registration_payments.csv') } - end - - # Check if the correct rows failed. - assert_not_nil assigns(:csvfails) - assigns(:csvfails).each do |csvfail| - assert_match(/FAIL.*/, csvfail.to_s) - end - - # Check if the flash is correct - assert_equal 'Updated 1 payment successfully.', flash[:success] - assert_equal 'The rows listed below contained an invalid code, please fix them by hand.', flash[:error] - - # Check if the success registration got changed. - assert_equal 0.01, three.reload.paid - - end - - test "resend actuallly sends an email" do - assert_difference "ActionMailer::Base.deliveries.size", +1 do - xhr :get, :resend, event_id: events(:codenight), id: registrations(:one).id - end - end - - test "resend sends payment email when !is_paid" do - assert_difference "ActionMailer::Base.deliveries.size", +1 do - xhr :get, :resend, event_id: events(:codenight), id: registrations(:three).id - end - - email = ActionMailer::Base.deliveries.last - assert_match(/Registration for/, email.subject) - end - - test "resend sends ticket email when is_paid" do - assert_difference "ActionMailer::Base.deliveries.size", +1 do - xhr :get, :resend, event_id: events(:codenight), id: registrations(:one).id - end - - email = ActionMailer::Base.deliveries.last - assert_match(/Ticket for/, email.subject) - end - - test "manual full paying works" do - three = registrations(:three) - four = registrations(:four) - - assert_equal 0, three.paid - assert_equal 0.05, four.paid - - [three, four].each do |registration| - assert_difference "ActionMailer::Base.deliveries.size", +1 do - xhr :put, :update, { - event_id: registration.event.id, - id: registration.id, - registration: { to_pay: 0 } - }, remote: true - end - assert_equal registration.price, registration.reload.paid - email = ActionMailer::Base.deliveries.last - assert_match(/Ticket for/, email.subject) - end - - end - - test "manual partial paying works" do - three = registrations(:three) - four = registrations(:four) - - assert_equal 0, three.paid - assert_equal 0.05, four.paid - - to_pay = 0.01 - - [three, four].each do |registration| - assert_difference "ActionMailer::Base.deliveries.size", +1 do - xhr :put, :update, { - event_id: registration.event.id, - id: registration.id, - registration: { to_pay: to_pay } - }, remote: true - end - assert registration.price > registration.reload.paid - email = ActionMailer::Base.deliveries.last - assert_match(/Registration for/, email.subject) - end - - end - - test "manual overpaying works" do - three = registrations(:three) - four = registrations(:four) - - assert_equal 0, three.paid - assert_equal 0.05, four.paid - - to_pay = -5 - - [three, four].each do |registration| - assert_difference "ActionMailer::Base.deliveries.size", +2 do - xhr :put, :update, { - event_id: registration.event.id, - id: registration.id, - registration: { to_pay: to_pay } - }, remote: true - end - assert registration.price < registration.reload.paid - - email = ActionMailer::Base.deliveries[-2] - assert_match(/Ticket for/, email.subject) - - email = ActionMailer::Base.deliveries[-1] - assert_match(/Overpayment for/, email.subject) - end - - end - - - test "manual not changing mails nor changes the code" do - three = registrations(:three) - four = registrations(:four) - - assert_equal 0, three.paid - assert_equal 0.05, four.paid - - [three, four].each do |registration| - paid, code = registration.paid, registration.payment_code - assert_no_difference "ActionMailer::Base.deliveries.size" do - xhr :put, :update, { - event_id: registration.event.id, - id: registration.id, - registration: { to_pay: registration.to_pay } - }, remote: true - end - assert_equal paid, registration.reload.paid - assert_equal code, registration.reload.payment_code - end - end - - test "basic registration" do - - # setting up data - galabal = events(:galabal) - posthash = { - event_id: galabal.id, - registration: { - access_levels: 2, - email: "a@b.com", - name: "Ab Cd", - student_number: 123, - comment: "" - } - } - - assert_difference "Registration.count", +1 do - assert_difference "ActionMailer::Base.deliveries.size", +1 do - post :basic, posthash - end - end - end - - test "admins can manage registrations from other events" do - user = users(:adminfelix) - ability = Ability.new(user) - - r = registrations(:two) - assert ability.can?(:manage, r) - end - + # test "the truth" do + # assert true + # end end diff --git a/test/controllers/tickets_controller_test.rb b/test/controllers/tickets_controller_test.rb new file mode 100644 index 00000000..a0145e7b --- /dev/null +++ b/test/controllers/tickets_controller_test.rb @@ -0,0 +1,11 @@ +require 'test_helper' + +class TicketsControllerTest < ActionController::TestCase + test "admins can manage registrations from other events" do + user = users(:adminfelix) + ability = Ability.new(user) + + r = tickets(:checkin_test_ticket_galabal) + assert ability.can?(:manage, r) + end +end diff --git a/test/controllers/zones_controller_test.rb b/test/controllers/zones_controller_test.rb deleted file mode 100644 index 270b8852..00000000 --- a/test/controllers/zones_controller_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class ZonesControllerTest < ActionController::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/fixtures/access_levels.yml b/test/fixtures/access_levels.yml index 00ad0bc1..0db8763f 100644 --- a/test/fixtures/access_levels.yml +++ b/test/fixtures/access_levels.yml @@ -9,7 +9,7 @@ # updated_at :datetime # capacity :integer # price :integer -# public :boolean default(TRUE) +# public :boolean default("t") # has_comment :boolean # hidden :boolean # member_only :boolean @@ -18,30 +18,26 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html one: - id: 1 name: Lid - event_id: 1 + event: codenight price: 0 member: - id: 4 name: Member - event_id: 1 + event: codenight member_only: 1 price: 0 two: - id: 2 name: VIP - event_id: 2 + event: galabal price: 10 # Capacity stuff testing unlimited: - id: 3 name: Unlimited - event_id: 1 + event: codenight price: 0 <% 3.times do |n| %> @@ -49,22 +45,32 @@ limited_<%= n %>: id: <%= 100 + n %> name: <%= "Limited#{n}" %> price: 0 - event_id: 1 + event: codenight capacity: <%= 3 + n %> <% end %> # Can can testing hidden: - id: 5 name: Hidden - event_id: 3 + event: twaalfurenloop price: 0 hidden: true member_only: - id: 6 name: Member Only - event_id: 3 + event: twaalfurenloop price: 0 member_only: true +# Ticket validation tests +ticket_validation_open: + name: Open ticket validation + event: codenight + price: 0 + member_only: false + +ticket_validation_member: + name: Member only ticket validation + event: codenight + price: 0 + member_only: true diff --git a/test/fixtures/accesses.yml b/test/fixtures/accesses.yml deleted file mode 100644 index 8a785fbf..00000000 --- a/test/fixtures/accesses.yml +++ /dev/null @@ -1,33 +0,0 @@ -# == Schema Information -# -# Table name: accesses -# -# id :integer not null, primary key -# period_id :integer -# registration_id :integer -# created_at :datetime -# updated_at :datetime -# access_level_id :integer -# - - -one: - id: 1 - period_id: 1 - registration_id: 1 - access_level_id: 1 - -two: - id: 2 - period_id: 2 - registration_id: 2 - access_level_id: 2 - -# Make three accesses to each Limited access level -<% 9.times do |n| %> -access_<%= n %>: - id: <%= 100 + n %> - period_id: 3 - registration_id: <%= 100 + n %> - access_level_id: <%= 100 + (n % 3) %> -<% end %> diff --git a/test/fixtures/events.yml b/test/fixtures/events.yml index 605b6f62..d9bf499d 100644 --- a/test/fixtures/events.yml +++ b/test/fixtures/events.yml @@ -14,22 +14,21 @@ # registration_open_date :datetime # registration_close_date :datetime # bank_number :string(255) -# show_ticket_count :boolean default(TRUE) +# show_ticket_count :boolean default("t") # contact_email :string(255) # export_file_name :string(255) # export_content_type :string(255) # export_file_size :integer # export_updated_at :datetime -# export_status :string(255) # show_statistics :boolean +# export_status :string(255) # club_id :integer -# registration_open :boolean default(TRUE) +# registration_open :boolean default("t") # # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html codenight: - id: 1 name: Codenight contact_email: blargh@gmail.com start_date: 2013-09-17 16:25:51 @@ -40,7 +39,6 @@ codenight: club: zeus galabal: - id: 2 name: Galabal contact_email: blargh2@gmail.com start_date: 2013-09-17 16:25:51 @@ -52,7 +50,6 @@ galabal: bank_number: BE62 5100 0754 7061 twaalfurenloop: - id: 3 name: 12urenloop contact_email: info@12urenloop.be start_date: 2014-04-25 10:00:00 diff --git a/test/fixtures/included_zones.yml b/test/fixtures/included_zones.yml deleted file mode 100644 index ba898a25..00000000 --- a/test/fixtures/included_zones.yml +++ /dev/null @@ -1,20 +0,0 @@ -# == Schema Information -# -# Table name: included_zones -# -# id :integer not null, primary key -# zone_id :integer -# access_level_id :integer -# created_at :datetime -# updated_at :datetime -# - -# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html - -one: - zone_id: - access_level_id: - -two: - zone_id: - access_level_id: diff --git a/test/fixtures/orders.yml b/test/fixtures/orders.yml new file mode 100644 index 00000000..40b0b073 --- /dev/null +++ b/test/fixtures/orders.yml @@ -0,0 +1,100 @@ +# == Schema Information +# +# Table name: orders +# +# id :integer not null, primary key +# status :string default("initial") +# name :string +# email :string +# gsm :string +# ticket_id :integer +# event_id :integer +# paid :integer +# price :integer +# created_at :datetime +# updated_at :datetime +# payment_code :string +# + +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +one: + name: Tom Naessens + email: supermail@gmail.com + event: codenight + paid: 0 + price: 0 + status: initial + payment_code: <%= Order.create_payment_code %> + +two: + name: Maarten Herthoge + email: fakemail@gmail.com + event: galabal + paid: 5 + price: 10 + status: initial + payment_code: <%= Order.create_payment_code %> + +three: + name: Felix Van der Jeugt + email: felix.vanderjeblarghugt@gmail.com + event: codenight + paid: 0 + price: 20 + status: initial + payment_code: GAN7539840256920891 + +four: + name: Felix Van der Jeugd + email: felix.vanderjeugd@gmail.com + event: codenight + paid: 5 + price: 10 + status: initial + payment_code: <%= Order.create_payment_code %> + +free: + name: Free + email: free@email.com + event: codenight + paid: 0 + price: 0 + payment_code: <%= Order.create_payment_code %> + +non_free_not_paid: + name: Non Free Not Paid + email: an@email.com + event: codenight + paid: 0 + price: 20 + status: active + payment_code: <%= Order.create_payment_code %> + +non_free_partially_paid: + name: Non Free Partially Paid + email: another@email.com + event: codenight + paid: 5 + price: 10 + status: initial + payment_code: <%= Order.create_payment_code %> + +# Ticket validation tests +ticket_validation_active: + name: Ticket Validation Order + email: ticket@validation.com + event: codenight + paid: 0 + price: 0 + status: active + payment_code: <%= Order.create_payment_code %> + +ticket_validation_add_ticket_info: + name: Ticket Validation Order + email: ticket@validation.com + event: codenight + paid: 0 + price: 0 + status: add_ticket_info + payment_code: <%= Order.create_payment_code %> diff --git a/test/fixtures/partners.yml b/test/fixtures/partners.yml index 7e05aad3..ea9119e5 100644 --- a/test/fixtures/partners.yml +++ b/test/fixtures/partners.yml @@ -12,7 +12,7 @@ # reset_password_token :string(255) # reset_password_sent_at :datetime # remember_created_at :datetime -# sign_in_count :integer default(0), not null +# sign_in_count :integer default("0"), not null # current_sign_in_at :datetime # last_sign_in_at :datetime # current_sign_in_ip :string(255) @@ -25,25 +25,22 @@ # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html KBC: - id: 1 name: KBC email: kbc@email.com - event_id: 1 - access_level_id: 1 + event: codenight + access_level: one authentication_token: KBC Zeus: - id: 2 name: Zeus email: zeus@email.com - event_id: 1 - access_level_id: 1 + event: codenight + access_level: one authentication_token: zeus SKO: - id: 3 name: SKO email: sko@email.com - event_id: 2 - access_level_id: 1 + event: galabal + access_level: one authentication_token: sko diff --git a/test/fixtures/periods.yml b/test/fixtures/periods.yml deleted file mode 100644 index 16b917b2..00000000 --- a/test/fixtures/periods.yml +++ /dev/null @@ -1,33 +0,0 @@ -# == Schema Information -# -# Table name: periods -# -# id :integer not null, primary key -# starts :datetime -# ends :datetime -# name :string(255) -# created_at :datetime -# updated_at :datetime -# event_id :integer -# - -# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html - -one: - id: 1 - starts: 2013-09-17 20:09:09 - ends: 2013-09-17 20:09:09 - name: Period1 - -two: - id: 2 - starts: 2013-09-17 20:09:09 - ends: 2013-09-17 20:09:09 - name: Period2 - -capacity_period: - id: 3 - starts: 2013-09-17 20:09:09 - ends: 2013-09-17 20:09:09 - name: Capacity Period - diff --git a/test/fixtures/promos.yml b/test/fixtures/promos.yml index 1214e96b..a83fe743 100644 --- a/test/fixtures/promos.yml +++ b/test/fixtures/promos.yml @@ -8,7 +8,7 @@ # limit :integer # created_at :datetime # updated_at :datetime -# sold_tickets :integer default(0) +# sold_tickets :integer default("0") # # Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html diff --git a/test/fixtures/registrations.yml b/test/fixtures/registrations.yml deleted file mode 100644 index a90afc5b..00000000 --- a/test/fixtures/registrations.yml +++ /dev/null @@ -1,82 +0,0 @@ -# == Schema Information -# -# Table name: registrations -# -# id :integer not null, primary key -# barcode :string(255) -# name :string(255) -# email :string(255) -# created_at :datetime -# updated_at :datetime -# event_id :integer -# paid :integer -# student_number :string(255) -# price :integer -# checked_in_at :datetime -# comment :text -# barcode_data :string(255) -# payment_code :string(255) -# - -# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html - -one: - id: 1 - barcode: 1234567891231 - barcode_data: 123456789123 - name: Tom Naessens - email: supermail@gmail.com - student_number: 1 - event_id: 1 - paid: 0 - price: 0 - payment_code: <%= Registration.create_payment_code %> - -two: - id: 2 - barcode: 2222222222222 - barcode_data: 22222222222 - name: Maarten Herthoge - email: fakemail@gmail.com - student_number: 2 - event_id: 2 - paid: 5 - price: 10 - payment_code: <%= Registration.create_payment_code %> - -three: - id: 3 - barcode: 012345678901 - barcode_data: 012345678901 - name: Felix Van der Jeugt - email: felix.vanderjeblarghugt@gmail.com - student_number: 3 - event_id: 1 - paid: 0 - price: 20 - payment_code: GAN7539840256920891 - -four: - id: 4 - barcode: 012345678902 - barcode_data: 012345678902 - name: Felix Van der Jeugd - email: felix.vanderjeugd@gmail.com - student_number: 4 - event_id: 1 - paid: 5 - price: 10 - payment_code: <%= Registration.create_payment_code %> - -<% 9.times do |n| %> -capacity_registration_<%= n %>: - id: <%= 100 + n %> - barcode: 123456789123 - barcode_data: 123456789123 - email: capacity<%= n %>@test.com - name: Capacity Tester <%= n %> - paid: 0 - price: 0 - student_number: <%= 100 + n %> - payment_code: <%= Registration.create_payment_code %> -<% end %> diff --git a/test/fixtures/tickets.yml b/test/fixtures/tickets.yml new file mode 100644 index 00000000..cf4175fe --- /dev/null +++ b/test/fixtures/tickets.yml @@ -0,0 +1,102 @@ +# == Schema Information +# +# Table name: tickets +# +# id :integer not null, primary key +# name :string +# email :string +# checked_in_at :datetime +# order_id :integer +# student_number :string +# comment :text +# barcode :string +# barcode_data :string +# created_at :datetime +# updated_at :datetime +# access_level_id :integer +# status :string default("initial") +# + +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html + +# CAPACITY TESTS +<% 9.times do |n| %> +capacity_registration_<%= n %>: + id: <%= 100 + n %> + email: capacity<%= n %>@test.com + name: Capacity Tester <%= n %> + student_number: <%= 100 + n %> + order: free + access_level_id: <%= 100 + (n % 3) %> +<% end %> + +# PAYMENT TESTS +payment_test_ticket_one: + name: One + email: one@gmail.com + order: non_free_not_paid + access_level: one + +payment_test_ticket_two: + name: Two + email: two@gmail.com + order: non_free_not_paid + access_level: one + +payment_test_ticket_three: + name: Three + email: three@gmail.com + order: non_free_partially_paid + access_level: one + +# CHECKIN TESTS +checkin_test_ticket_codenight: + name: Checking Test Codenight + email: checking@test.one + order: free + barcode: 1234567891231 + barcode_data: 123456789123 + access_level: one + +checkin_test_ticket_galabal: + name: Checking Test Galabal + email: checking@test.galabal + order: non_free_not_paid + barcode: 2222222222222 + barcode_data: 22222222222 + access_level: one + +checkin_test_ticket_unpaid_order: + name: Checking Test Codenight + email: checking@test.one + order: non_free_not_paid + barcode: 3333333333333 + barcode_data: 33333333333 + access_level: one + checked_in_at: <%= Time.now %> + +# Ticket validation tests +ticket_validation_active: + name: Ticket validation active + email: ticket@validation.active + order: ticket_validation_active + barcode: 4 + barcode_data: 5 + access_level: one + +ticket_validation_add_ticket_info: + name: Ticket validation add ticket info + email: ticket@validation.add + order: ticket_validation_add_ticket_info + barcode: 4 + barcode_data: 5 + access_level: one + +ticket_validation_active_member_only: + name: Ticket validation active member only + email: ticket@validation.acti + order: ticket_validation_active + barcode: 4 + barcode_data: 5 + access_level: ticket_validation_member + student_number: 40 diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index 81d87e6a..efb6a4ca 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -5,7 +5,7 @@ # id :integer not null, primary key # username :string(255) default(""), not null # remember_created_at :datetime -# sign_in_count :integer default(0), not null +# sign_in_count :integer default("0"), not null # current_sign_in_at :datetime # last_sign_in_at :datetime # current_sign_in_ip :string(255) @@ -50,5 +50,5 @@ matthias: adminfelix: username: noctua clubs: - -zeus + - zeus admin: 1 diff --git a/test/fixtures/zones.yml b/test/fixtures/zones.yml deleted file mode 100644 index 2877d799..00000000 --- a/test/fixtures/zones.yml +++ /dev/null @@ -1,22 +0,0 @@ -# == Schema Information -# -# Table name: zones -# -# id :integer not null, primary key -# name :string(255) -# event_id :integer -# created_at :datetime -# updated_at :datetime -# - -# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html - -one: - id: 1 - name: MyString - event_id: 1 - -two: - id: 2 - name: MyString - event_id: 2 diff --git a/test/helpers/included_zones_helper_test.rb b/test/helpers/included_zones_helper_test.rb deleted file mode 100644 index a6e7594b..00000000 --- a/test/helpers/included_zones_helper_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class IncludedZonesHelperTest < ActionView::TestCase -end diff --git a/test/helpers/orders_helper_test.rb b/test/helpers/orders_helper_test.rb new file mode 100644 index 00000000..52dacae1 --- /dev/null +++ b/test/helpers/orders_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class OrdersHelperTest < ActionView::TestCase +end diff --git a/test/helpers/periods_helper_test.rb b/test/helpers/periods_helper_test.rb deleted file mode 100644 index 2f42a639..00000000 --- a/test/helpers/periods_helper_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class PeriodsHelperTest < ActionView::TestCase -end diff --git a/test/helpers/tickets_helper_test.rb b/test/helpers/tickets_helper_test.rb new file mode 100644 index 00000000..687a83b0 --- /dev/null +++ b/test/helpers/tickets_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class TicketsHelperTest < ActionView::TestCase +end diff --git a/test/helpers/zones_helper_test.rb b/test/helpers/zones_helper_test.rb deleted file mode 100644 index af11cbb6..00000000 --- a/test/helpers/zones_helper_test.rb +++ /dev/null @@ -1,4 +0,0 @@ -require 'test_helper' - -class ZonesHelperTest < ActionView::TestCase -end diff --git a/test/mailers/registration_mailer_test.rb b/test/mailers/registration_mailer_test.rb deleted file mode 100644 index 68fe595b..00000000 --- a/test/mailers/registration_mailer_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class RegistrationMailerTest < ActionMailer::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/models/access_level_test.rb b/test/models/access_level_test.rb index 96558bfe..b6faddf3 100644 --- a/test/models/access_level_test.rb +++ b/test/models/access_level_test.rb @@ -9,7 +9,7 @@ # updated_at :datetime # capacity :integer # price :integer -# public :boolean default(TRUE) +# public :boolean default("t") # has_comment :boolean # hidden :boolean # member_only :boolean diff --git a/test/models/event_test.rb b/test/models/event_test.rb index 6dc6ae2f..cf637107 100644 --- a/test/models/event_test.rb +++ b/test/models/event_test.rb @@ -14,7 +14,7 @@ # registration_open_date :datetime # registration_close_date :datetime # bank_number :string(255) -# show_ticket_count :boolean default(TRUE) +# show_ticket_count :boolean default("t") # contact_email :string(255) # export_file_name :string(255) # export_content_type :string(255) @@ -23,7 +23,7 @@ # show_statistics :boolean # export_status :string(255) # club_id :integer -# registration_open :boolean default(TRUE) +# registration_open :boolean default("t") # require 'test_helper' diff --git a/test/models/included_zone_test.rb b/test/models/included_zone_test.rb deleted file mode 100644 index 1732d141..00000000 --- a/test/models/included_zone_test.rb +++ /dev/null @@ -1,20 +0,0 @@ -# == Schema Information -# -# Table name: included_zones -# -# id :integer not null, primary key -# zone_id :integer -# access_level_id :integer -# created_at :datetime -# updated_at :datetime -# - -require 'test_helper' - -class IncludedZoneTest < ActiveSupport::TestCase - verify_fixtures IncludedZone - - # test "the truth" do - # assert true - # end -end diff --git a/test/models/order_test.rb b/test/models/order_test.rb new file mode 100644 index 00000000..87cd9849 --- /dev/null +++ b/test/models/order_test.rb @@ -0,0 +1,30 @@ +# == Schema Information +# +# Table name: orders +# +# id :integer not null, primary key +# status :string default("initial") +# name :string +# email :string +# gsm :string +# ticket_id :integer +# event_id :integer +# paid :integer +# price :integer +# created_at :datetime +# updated_at :datetime +# payment_code :string +# + +require 'test_helper' + +class OrderTest < ActiveSupport::TestCase + verify_fixtures Order + + test "active? returns correct status" do + order = orders(:one) + assert !order.active? + order.status = 'active' + assert order.active? + end +end diff --git a/test/models/partner_test.rb b/test/models/partner_test.rb index c288bf34..0f39f1cd 100644 --- a/test/models/partner_test.rb +++ b/test/models/partner_test.rb @@ -12,7 +12,7 @@ # reset_password_token :string(255) # reset_password_sent_at :datetime # remember_created_at :datetime -# sign_in_count :integer default(0), not null +# sign_in_count :integer default("0"), not null # current_sign_in_at :datetime # last_sign_in_at :datetime # current_sign_in_ip :string(255) diff --git a/test/models/period_test.rb b/test/models/period_test.rb deleted file mode 100644 index b162cce5..00000000 --- a/test/models/period_test.rb +++ /dev/null @@ -1,22 +0,0 @@ -# == Schema Information -# -# Table name: periods -# -# id :integer not null, primary key -# starts :datetime -# ends :datetime -# name :string(255) -# created_at :datetime -# updated_at :datetime -# event_id :integer -# - -require 'test_helper' - -class PeriodTest < ActiveSupport::TestCase - verify_fixtures Period - - # test "the truth" do - # assert true - # end -end diff --git a/test/models/promo_test.rb b/test/models/promo_test.rb index 12eb30c2..9a025d2c 100644 --- a/test/models/promo_test.rb +++ b/test/models/promo_test.rb @@ -8,7 +8,7 @@ # limit :integer # created_at :datetime # updated_at :datetime -# sold_tickets :integer default(0) +# sold_tickets :integer default("0") # require 'test_helper' diff --git a/test/models/registration_test.rb b/test/models/registration_test.rb deleted file mode 100644 index 7705cc4f..00000000 --- a/test/models/registration_test.rb +++ /dev/null @@ -1,64 +0,0 @@ -# == Schema Information -# -# Table name: registrations -# -# id :integer not null, primary key -# barcode :string(255) -# name :string(255) -# email :string(255) -# created_at :datetime -# updated_at :datetime -# event_id :integer -# paid :integer -# student_number :string(255) -# price :integer -# checked_in_at :datetime -# comment :text -# barcode_data :string(255) -# payment_code :string(255) -# - -require 'test_helper' - -class RegistrationTest < ActiveSupport::TestCase - verify_fixtures Registration - - def setup - @r1 = Registration.new(student_number: "01", name: "test", email: "test@test.com", payment_code: Registration.create_payment_code, price: 1, paid: 0) - @r2 = @r1.dup - @r2.payment_code = Registration.create_payment_code - end - - test "student_number should be unique on event basis" do - @r1.event = events(:codenight) - @r1.save! - @r2.event = events(:codenight) - assert !@r2.valid? - assert !@r2.errors[:student_number].blank? - end - - test "student_number should work for multiple events" do - @r1.event = events(:codenight) - @r1.save! - @r2.event = events(:galabal) - assert @r2.save - end - - test "student_number should be present on member_only tickets" do - @r1.student_number = "" - @r1.access_levels << access_levels(:member_only) - assert !@r1.save - end - - test "student_number can be blank on non-member_only tickets" do - @r1.student_number = "" - @r1.access_levels << access_levels(:unlimited) - assert @r1.save - end - - def teardown - @r1.destroy - @r2.destroy - end - -end diff --git a/test/models/ticket_test.rb b/test/models/ticket_test.rb new file mode 100644 index 00000000..0aac698b --- /dev/null +++ b/test/models/ticket_test.rb @@ -0,0 +1,77 @@ +# == Schema Information +# +# Table name: tickets +# +# id :integer not null, primary key +# name :string +# email :string +# checked_in_at :datetime +# order_id :integer +# student_number :string +# comment :text +# barcode :string +# barcode_data :string +# created_at :datetime +# updated_at :datetime +# access_level_id :integer +# status :string default("initial") +# + +require 'test_helper' + +class TicketTest < ActiveSupport::TestCase + verify_fixtures Ticket + + def setup + end + + test "multiple non member tickets for the same access level should not be able to have the same name" do + active_order = orders(:ticket_validation_add_ticket_info) + + t1 = active_order.tickets.new name: "Zelfde", email: "Zelfde", access_level: access_levels(:ticket_validation_open) + t2 = active_order.tickets.new name: "Zelfde", email: "Zelfde", access_level: access_levels(:ticket_validation_open) + + assert t1.save + assert !t2.save + end + + test "multiple non member tickets for different access levels should be able to have the same name" do + active_order = orders(:ticket_validation_add_ticket_info) + + t1 = active_order.tickets.new name: "Zelfde", email: "Zelfde", access_level: access_levels(:ticket_validation_open) + t2 = active_order.tickets.new name: "Zelfde", email: "Zelfde", access_level: access_levels(:ticket_validation_member) + + assert t1.save + assert t2.save + end + + test "info should be unique on event basis for member-only tickets" do + active_order = orders(:ticket_validation_add_ticket_info) + + t1 = active_order.tickets.new name: "Zelfde", email: "Zelfde", access_level: access_levels(:ticket_validation_member) + t2 = active_order.tickets.new name: "Zelfde", email: "Zelfde", access_level: access_levels(:ticket_validation_member) + + assert t1.save + assert !t2.save + end + + test "a member should not be able to order another member only ticket in another order in the same event" do + add_ticket_info_order = orders(:ticket_validation_add_ticket_info) + + t = add_ticket_info_order.tickets.new name: "Ticket validation active member only", email: "ticket@validation.activememberonly", access_level: access_levels(:ticket_validation_member) + + assert !t.save + end + + test "same student_number should work for multiple events" do + end + + test "student_number should be present on member_only tickets" do + end + + test "student_number can be blank on non-member_only tickets" do + end + + def teardown + end +end diff --git a/test/models/user_test.rb b/test/models/user_test.rb index 8596e3fe..4a0254b1 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -5,7 +5,7 @@ # id :integer not null, primary key # username :string(255) default(""), not null # remember_created_at :datetime -# sign_in_count :integer default(0), not null +# sign_in_count :integer default("0"), not null # current_sign_in_at :datetime # last_sign_in_at :datetime # current_sign_in_ip :string(255) diff --git a/test/models/zone_access_test.rb b/test/models/zone_access_test.rb deleted file mode 100644 index 60429751..00000000 --- a/test/models/zone_access_test.rb +++ /dev/null @@ -1,7 +0,0 @@ -require 'test_helper' - -class ZoneAccessTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end -end diff --git a/test/models/zone_test.rb b/test/models/zone_test.rb deleted file mode 100644 index 35d885ae..00000000 --- a/test/models/zone_test.rb +++ /dev/null @@ -1,20 +0,0 @@ -# == Schema Information -# -# Table name: zones -# -# id :integer not null, primary key -# name :string(255) -# event_id :integer -# created_at :datetime -# updated_at :datetime -# - -require 'test_helper' - -class ZoneTest < ActiveSupport::TestCase - verify_fixtures Zone - - # test "the truth" do - # assert true - # end -end