artfully_ose 1.3.0.pre3 → 1.3.0.pre4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/loading-white.gif +0 -0
  3. data/app/assets/images/seating_temp/1.jpg +0 -0
  4. data/app/assets/images/seating_temp/10.jpg +0 -0
  5. data/app/assets/images/seating_temp/11.jpg +0 -0
  6. data/app/assets/images/seating_temp/2.jpg +0 -0
  7. data/app/assets/images/seating_temp/3.jpg +0 -0
  8. data/app/assets/images/seating_temp/4.jpg +0 -0
  9. data/app/assets/images/seating_temp/5.jpg +0 -0
  10. data/app/assets/images/seating_temp/6.jpg +0 -0
  11. data/app/assets/images/seating_temp/7.jpg +0 -0
  12. data/app/assets/images/seating_temp/8.jpg +0 -0
  13. data/app/assets/images/seating_temp/9.jpg +0 -0
  14. data/app/assets/images/seating_temp/icon_43405.png +0 -0
  15. data/app/assets/images/seating_temp/icon_43405.svg +3 -0
  16. data/app/assets/images/seating_temp/icon_43405_plus.png +0 -0
  17. data/app/assets/images/seating_temp/license.txt +8 -0
  18. data/app/assets/javascripts/application.js +1 -0
  19. data/app/assets/javascripts/custom/cookies.js +27 -0
  20. data/app/assets/javascripts/custom/inline-people-search.js +4 -0
  21. data/app/assets/javascripts/custom/job-monitor.js +0 -1
  22. data/app/assets/javascripts/exchange-seat-chart.js +5 -0
  23. data/app/assets/javascripts/seat-chart.js +606 -0
  24. data/app/assets/javascripts/show-seat-chart.js +17 -0
  25. data/app/assets/javascripts/store/store-seat-chart.js +76 -0
  26. data/app/assets/javascripts/store/store.js +14 -39
  27. data/app/assets/stylesheets/application.sass +49 -1
  28. data/app/assets/stylesheets/bootstrap-overrides.css +11 -3
  29. data/app/assets/stylesheets/sass/seat-chart.sass +311 -0
  30. data/app/assets/stylesheets/sass/store.sass +73 -19
  31. data/app/assets/stylesheets/storefront.css +2 -0
  32. data/app/concerns/pdf_generation.rb +1 -15
  33. data/app/controllers/advanced_searches_controller.rb +1 -3
  34. data/app/controllers/charts_controller.rb +14 -12
  35. data/app/controllers/console_sales_controller.rb +55 -0
  36. data/app/controllers/event_calendars_controller.rb +15 -0
  37. data/app/controllers/events_controller.rb +16 -5
  38. data/app/controllers/exchanges_controller.rb +32 -9
  39. data/app/controllers/export_controller.rb +8 -0
  40. data/app/controllers/members/sessions_controller.rb +0 -2
  41. data/app/controllers/membership_comps_controller.rb +2 -1
  42. data/app/controllers/prices_controller.rb +20 -0
  43. data/app/controllers/shows_controller.rb +3 -1
  44. data/app/controllers/store/events_controller.rb +6 -5
  45. data/app/controllers/store/orders_controller.rb +11 -13
  46. data/app/controllers/store/shows_controller.rb +1 -0
  47. data/app/controllers/store/store_controller.rb +11 -0
  48. data/app/controllers/tickets_controller.rb +0 -28
  49. data/app/controllers/user_memberships_controller.rb +7 -2
  50. data/app/controllers/venues_controller.rb +9 -0
  51. data/app/helpers/artfully_ose_helper.rb +18 -4
  52. data/app/helpers/seating_helper.rb +157 -0
  53. data/app/models/assigned_chart.rb +220 -0
  54. data/app/models/cart.rb +6 -1
  55. data/app/models/chart.rb +28 -17
  56. data/app/models/database_views/item_view.rb +76 -5
  57. data/app/models/discount.rb +4 -0
  58. data/app/models/discounts/buy_one_get_one_free_discount_type.rb +1 -1
  59. data/app/models/discounts/dollars_off_tickets_discount_type.rb +5 -1
  60. data/app/models/discounts/percentage_off_tickets_discount_type.rb +8 -4
  61. data/app/models/event.rb +86 -12
  62. data/app/models/general_admission_chart.rb +51 -0
  63. data/app/models/imports/events_import.rb +1 -1
  64. data/app/models/job/show_creator.rb +3 -10
  65. data/app/models/kit.rb +11 -1
  66. data/app/models/kits/assigned_seating_kit.rb +23 -0
  67. data/app/models/member_walkup.rb +1 -1
  68. data/app/models/order_handler.rb +22 -6
  69. data/app/models/organization.rb +4 -5
  70. data/app/models/person.rb +3 -1
  71. data/app/models/sale.rb +1 -1
  72. data/app/models/seat.rb +96 -0
  73. data/app/models/section.rb +1 -3
  74. data/app/models/show.rb +10 -17
  75. data/app/models/ticket.rb +30 -6
  76. data/app/models/ticket/locker.rb +3 -2
  77. data/app/models/ticket_type.rb +12 -6
  78. data/app/models/ticket_types_seat.rb +4 -0
  79. data/app/models/venue.rb +23 -0
  80. data/app/views/advanced_searches/filters/_birthday.html.haml +1 -0
  81. data/app/views/assigned_charts/_show.html.haml +12 -0
  82. data/app/views/console_sales/_aloha.html.haml +5 -4
  83. data/app/views/console_sales/new.html.haml +9 -0
  84. data/app/views/event_calendars/index.html.haml +34 -0
  85. data/app/views/events/_menu.html.haml +2 -1
  86. data/app/views/events/_section_fields.html.haml +13 -8
  87. data/app/views/events/new.html.haml +34 -4
  88. data/app/views/events/prices.html.haml +3 -4
  89. data/app/views/events/seating.html.haml +131 -0
  90. data/app/views/exchanges/_assigned_chart.html.haml +108 -0
  91. data/app/views/exchanges/_general_admission_chart.html.haml +55 -0
  92. data/app/views/exchanges/new.html.haml +1 -55
  93. data/app/views/general_admission_charts/_show.html.haml +2 -0
  94. data/app/views/layouts/_menu.html.haml +44 -31
  95. data/app/views/layouts/storefront.html.haml +72 -30
  96. data/app/views/membership_comps/new.html.haml +1 -0
  97. data/app/views/order_mailer/confirmation_for.html.haml +5 -3
  98. data/app/views/order_mailer/confirmation_for.text.haml +1 -2
  99. data/app/views/pdfs/order.html.haml +20 -6
  100. data/app/views/seating/_actions_menu.html.haml +10 -0
  101. data/app/views/seating/_chart.html.haml +15 -0
  102. data/app/views/seating/_chart_container.html.haml +2 -0
  103. data/app/views/seating/_chart_note_display.html.haml +7 -0
  104. data/app/views/seating/_hold_seats_modal.html.haml +39 -0
  105. data/app/views/seating/_layer_menu.html.haml +23 -0
  106. data/app/views/seating/_legend.html.haml +52 -0
  107. data/app/views/seating/_modify_seats_modal.html.haml +29 -0
  108. data/app/views/seating/_ticket_type_modals.html.haml +41 -0
  109. data/app/views/shows/_seat_chart.html.haml +122 -0
  110. data/app/views/shows/_sections_table.html.haml +3 -24
  111. data/app/views/shows/_ticket_table.html.haml +4 -2
  112. data/app/views/shows/_work_with.html.haml +4 -0
  113. data/app/views/shows/new.html.haml +2 -2
  114. data/app/views/shows/show.html.haml +93 -14
  115. data/app/views/store/assigned_charts/_show.html.haml +54 -0
  116. data/app/views/store/checkouts/shopping_cart_display/_tickets.haml +13 -0
  117. data/app/views/store/donations/index.html.haml +1 -1
  118. data/app/views/store/events/calendar.html.haml +94 -11
  119. data/app/views/store/events/index.html.haml +1 -1
  120. data/app/views/store/events/show.html.haml +36 -2
  121. data/app/views/store/events/single_show.html.haml +5 -4
  122. data/app/views/store/general_admission_charts/_show.html.haml +41 -0
  123. data/app/views/store/orders/show.html.haml +17 -4
  124. data/app/views/store/shared/_donate_form.html.haml +2 -1
  125. data/app/views/store/shared/_small_donate_form.html.haml +1 -1
  126. data/app/views/store/shows/_show.html.haml +1 -39
  127. data/app/views/ticket_types/edit.html.haml +1 -1
  128. data/app/views/user_memberships/_list.html.haml +1 -1
  129. data/app/views/venues/edit.html.haml +1 -1
  130. data/app/views/venues/show.html.haml +11 -0
  131. data/config/routes.rb +27 -10
  132. data/db/migrate/20140828174357_add_type_to_chart.rb +7 -0
  133. data/db/migrate/20140828195617_create_seats.rb +16 -0
  134. data/db/migrate/20140829135426_add_venue_to_chart.rb +5 -0
  135. data/db/migrate/20140829143520_add_assigned_to_event.rb +5 -0
  136. data/db/migrate/20140904164927_add_fields_to_seat.rb +14 -0
  137. data/db/migrate/20140912170010_add_note_to_seat.rb +6 -0
  138. data/db/migrate/20140919152307_add_seats_to_ticket.rb +5 -0
  139. data/db/migrate/20140930224543_add_public_note_to_chart.rb +5 -0
  140. data/db/migrate/20141001140737_add_seat_id_index_to_tickets.rb +5 -0
  141. data/db/migrate/20141001193242_associate_hold_with_person.rb +6 -0
  142. data/db/migrate/20141021175311_create_ticket_types_seats.rb +11 -0
  143. data/db/migrate/20150106161744_migrate_charts_back_to_venues.rb +18 -0
  144. data/db/migrate/20151105085424_add_creator_to_items_view.rb +40 -0
  145. data/lib/artfully_ose/version.rb +1 -1
  146. data/spec/factories/assigned_chart_factories.rb +18 -0
  147. data/spec/factories/chart_factories.rb +4 -8
  148. data/spec/factories/kit_factories.rb +4 -0
  149. data/spec/factories/seat_factories.rb +4 -0
  150. data/spec/factories/show_factories.rb +1 -1
  151. metadata +66 -5
  152. data/app/models/ticket/foundry.rb +0 -48
  153. data/app/models/ticket/template.rb +0 -40
  154. data/app/views/store/events/_calendar.html.haml +0 -13
@@ -1,6 +1,5 @@
1
1
  @import "colors"
2
2
  @import "mixins"
3
- @import url(https://fonts.googleapis.com/css?family=Roboto:400,100,300)
4
3
 
5
4
  body
6
5
  padding-top: 10px
@@ -150,7 +149,7 @@ ul#shows, ul#memberships
150
149
  text-align: center
151
150
  .month
152
151
  text-transform: uppercase
153
- font-size: 10px
152
+ font-size: 12px
154
153
  .day
155
154
  font-size: 30px
156
155
  .time
@@ -158,6 +157,7 @@ ul#shows, ul#memberships
158
157
  h4.day_and_month
159
158
  font-weight: bold
160
159
  margin-bottom: 5px
160
+ margin-top: 2px
161
161
 
162
162
  .sections
163
163
  margin-bottom: 20px
@@ -176,7 +176,6 @@ ul#shows, ul#memberships
176
176
  width: 100px
177
177
  input[type="submit"]
178
178
  margin-top: -8px
179
-
180
179
  ul#memberships
181
180
  li
182
181
  .title
@@ -193,12 +192,40 @@ ul#memberships
193
192
  font-size: 25px
194
193
  font-weight: bold
195
194
 
195
+ .seat-row
196
+ margin-bottom: 3px
197
+ .seat
198
+ height: 24px
199
+ width: 24px
200
+ border-radius: 14px
201
+ border: 1px solid #CECECE
202
+ float: left
203
+ margin-left: 2px
204
+ background-repeat: no-repeat
205
+ .seat-mini
206
+ height: 16px
207
+ width: 16px
208
+ border-radius: 10px
209
+ .seat-chosen
210
+ background-color: orange
211
+ .empty
212
+ background-color: #479FFF
213
+ .filled
214
+ background-color: grey
215
+ .wheelchair
216
+ background-image: image_url('/assets/seating_temp/icon_43405.png')
217
+ background-position: 5px 3px
218
+ background-size: 18px 18px
219
+ .noseat
220
+ border: 0px
221
+ width: 26px
222
+ .clear
223
+ clear: both
224
+ .member-off
225
+ opacity: 0.5
196
226
 
197
227
  .calendar-month
198
- margin-bottom: 50px
199
- float: left
200
- margin-right: 30px
201
- min-height: 250px
228
+ margin-bottom: 20px
202
229
  h3
203
230
  font-weight: bold
204
231
 
@@ -340,21 +367,12 @@ table.calendar
340
367
 
341
368
  .clean
342
369
  .navbar-inner
343
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2))
344
- background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2)
345
- background-image: -o-linear-gradient(top, #ffffff, #f2f2f2)
346
- background-image: linear-gradient(to bottom, #ffffff, #f2f2f2)
347
370
  background-repeat: repeat-x
348
371
  border: 1px solid #d4d4d4
349
- -webkit-border-radius: 4px
350
- -moz-border-radius: 4px
351
- border-radius: 4px
352
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0)
353
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065)
354
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065)
355
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065)
372
+ background-image: none
356
373
  .brand-lite
357
- color: #331
374
+ color: #fff
375
+ font-weight: 100
358
376
 
359
377
  .navbar .btn.primary, .btn.btn-orange
360
378
  text-shadow: none
@@ -520,6 +538,18 @@ tr.no-border
520
538
  vertical-align: baseline
521
539
  margin-top: 0
522
540
 
541
+ #stage
542
+ width: 200px
543
+ height: 50px
544
+ border: 1px solid #999
545
+ margin: 5px auto
546
+ background-color: #dfdfdf
547
+ text-align: center
548
+ #text
549
+ padding-top: 27px
550
+ color: #666
551
+ padding-top: 18px
552
+
523
553
  #event-header.side-section
524
554
  h4
525
555
  padding-bottom: 8px
@@ -528,3 +558,27 @@ tr.no-border
528
558
  font-weight: bold
529
559
  line-height: 1.4em
530
560
  font-size: 1em
561
+
562
+ .add-to-cart-success
563
+ .add-to-cart-message
564
+ font-size: 24px
565
+ color: black
566
+ line-height: 24px
567
+ padding-top: 10px
568
+
569
+ #loginNagModal
570
+ .modal-header
571
+ border-bottom: 3px double #ddd
572
+ h4
573
+ font-size: 1.3em
574
+ .modal-body
575
+ .well
576
+ height: 160px
577
+ h6
578
+ font-size: 14px
579
+ .button-container
580
+ margin-top: 30px
581
+ form
582
+ margin-top: 20px
583
+ .center
584
+ text-align: center
@@ -1,6 +1,8 @@
1
1
  /*
2
2
  *= require bootstrap
3
+ *= require jquery/fullcalendar.css
3
4
  *= require sass/cart
5
+ *= require sass/seat-chart
4
6
  *= require sass/store
5
7
  *= require font-awesome
6
8
  *= require_self
@@ -2,17 +2,11 @@ require 'json'
2
2
  require 'digest/md5'
3
3
 
4
4
  class PdfGeneration
5
- PDF_POST_URL = "http://quick-pdf.geminisbs.net/pdfs.json"
6
- PDF_GET_URL = "http://quick-pdf.geminisbs.net/pdfs/:id.json?api_key=:key"
7
- PDF_DOWNLOAD_URL = "http://quick-pdf.geminisbs.net/pdfs/:id/download?api_key=:key"
8
5
 
9
6
  attr_accessor :pdf_options
10
7
 
11
- def initialize(pdfable, pdf_api_key = PDF_API_KEY, http_party = HTTParty, sleeper = Kernel)
8
+ def initialize(pdfable)
12
9
  @pdfable = pdfable
13
- @pdf_api_key = pdf_api_key
14
- @http_party = http_party
15
- @sleeper = sleeper
16
10
  @pdf_options = {}
17
11
  end
18
12
 
@@ -53,12 +47,4 @@ class PdfGeneration
53
47
  def filename
54
48
  "#{Digest::MD5.hexdigest pdfable.id.to_s}.pdf"
55
49
  end
56
-
57
- def status_url(json)
58
- PDF_GET_URL.gsub(":id", json["id"].to_s).gsub(":key", pdf_api_key)
59
- end
60
-
61
- def download_url(json)
62
- PDF_DOWNLOAD_URL.gsub(":id", json["id"].to_s).gsub(":key", pdf_api_key)
63
- end
64
50
  end
@@ -11,8 +11,6 @@ class AdvancedSearchesController < ApplicationController
11
11
  redirect_to new_search_path and return
12
12
  end
13
13
 
14
- @search = AdvancedSearch.new(params[:search])
15
-
16
14
  respond_to do |format|
17
15
  format.html
18
16
  format.js { render json: { shows: @shows, ticket_types: @ticket_types }}
@@ -39,7 +37,7 @@ class AdvancedSearchesController < ApplicationController
39
37
 
40
38
  respond_to do |format|
41
39
  format.html
42
- format.csv { render :csv => Person.where(id: @search.people_ids(1, AdvancedSearch::MAX_SOLR_RESULTS)).includes(:phones, :address, :tags).order('lower(people.last_name)'), :filename => "#{@search.id}-#{DateTime.now.strftime("%m-%d-%y")}" }
40
+ format.csv { render :csv => Person.where(id: @search.people_ids(1, AdvancedSearch::MAX_SOLR_RESULTS)).includes(:phones, :addresses, :tags).order('lower(people.last_name)'), :filename => "#{@search.id}-#{DateTime.now.strftime("%m-%d-%y")}" }
43
41
  end
44
42
  end
45
43
 
@@ -1,19 +1,21 @@
1
1
  class ChartsController < ApplicationController
2
2
  def update
3
- @chart = Chart.find(params[:id])
4
- authorize! :edit, @chart
5
3
 
6
- if @chart.update_attributes_from_params(Chart.polish_params(params[:chart]))
7
- flash[:notice] = "Prices saved."
8
- else
9
- flash[:error] = "Please name all of your ticket types."
10
- redirect_to prices_event_url(@chart.event) and return
11
- end
4
+ assigned_chart = current_user.current_organization.charts.find(params[:id])
12
5
 
13
- if user_requesting_next_step?
14
- redirect_to image_event_path(@chart.event)
6
+ if params[:assigned_chart].present?
7
+ assigned_chart.update_attributes(params[:assigned_chart])
15
8
  else
16
- redirect_to prices_event_url(@chart.event)
9
+ assigned_chart.sync(JSON.parse params[:chart])
17
10
  end
11
+
12
+ #reload the chart so we can ensure tickets and ticket_Types are included
13
+ assigned_chart = Chart.includes(assigned_chart.class.included_models).find(assigned_chart)
14
+ render :partial => "seating/chart", :locals => { :chart => assigned_chart }, :layout => false
15
+ end
16
+
17
+ def show
18
+ assigned_chart = current_user.current_organization.charts.find(params[:id])
19
+ render :partial => "seating/chart", :locals => { :chart => assigned_chart }, :layout => false
18
20
  end
19
- end
21
+ end
@@ -14,11 +14,58 @@ class ConsoleSalesController < ArtfullyOseController
14
14
  @membership_types.each {|mt| @membership_types_hash[mt.id] = {:allow_multiple_memberships => mt.allow_multiple_memberships?,:formatted_ends_at => I18n.l(mt.ends_at, :format => :date_for_input)}}
15
15
 
16
16
  @pass_types = current_organization.pass_types.all
17
+
18
+ if selling_for_seat?
19
+ @seat = Seat.joins(:chart)
20
+ .where('charts.organization_id = ?',current_organization.id)
21
+ .find(params[:seat_id])
22
+
23
+ chart = @seat.chart
24
+ ticket = @seat.ticket
25
+
26
+ if ticket.sold?
27
+ flash[:error] = "We can't put this ticket in your cart because this ticket has already been sold."
28
+ return
29
+ end
30
+
31
+ @ticket_type = chart.ticket_types.find(params[:ticket_type_id])
32
+ OrderHandler.new(current_sales_console_cart, nil).add_tickets(ticket, @ticket_type)
33
+
34
+ params[:person_id] = @seat.held_for if @seat.held_for.present?
35
+ verify_person
36
+
37
+ if add_all_for_hold?
38
+ seats = Seat.joins(:chart)
39
+ .where('charts.organization_id = ?',current_organization.id)
40
+ .where(:held_for_id => @seat.held_for_id)
41
+
42
+ tickets = current_organization.tickets
43
+ .uncommitted
44
+ .where(:seat_id => seats.collect(&:id))
45
+ .where('cart_id is null')
46
+
47
+ OrderHandler.new(current_sales_console_cart, nil).add_tickets(tickets, @ticket_type)
48
+
49
+ else
50
+ unless @person.nil?
51
+ @other_seats_are_being_held = Seat.where(:chart_id => @seat.chart_id)
52
+ .where(:held_for_id => @seat.held_for_id)
53
+ .joins(:ticket)
54
+ .where('tickets.cart_id is null')
55
+ .count > 0
56
+ end
57
+ end
58
+ end
17
59
  end
18
60
 
19
61
  def update
20
62
  handler = OrderHandler.new(current_sales_console_cart, nil)
21
63
  handler.handle(params, current_organization)
64
+
65
+ unless current_sales_console_cart.applied_pass.nil?
66
+ @person = Person.find(current_sales_console_cart.applied_pass.person_id)
67
+ end
68
+
22
69
  flash[:alert] = handler.error unless handler.error.blank?
23
70
  redirect_to new_console_sale_path(:person_id => @person.try(:id))
24
71
  end
@@ -150,6 +197,14 @@ class ConsoleSalesController < ArtfullyOseController
150
197
  str
151
198
  end
152
199
 
200
+ def selling_for_seat?
201
+ params[:seat_id].present?
202
+ end
203
+
204
+ def add_all_for_hold?
205
+ params[:add_all].present? && params[:add_all] == "true"
206
+ end
207
+
153
208
  def verify_person
154
209
  @person_id = params[:person_id]
155
210
  if @person_id.present?
@@ -0,0 +1,15 @@
1
+ class EventCalendarsController < ArtfullyOseController
2
+ def index
3
+ respond_to do |format|
4
+ format.json do
5
+ starts_at = Time.at(params[:start].to_i).to_datetime
6
+ ends_at = Time.at(params[:end].to_i).to_datetime
7
+ render :json => Event.as_full_calendar_json(current_user.current_organization, starts_at, ends_at)
8
+ end
9
+
10
+ format.html do
11
+ render :index
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,17 +1,25 @@
1
1
  class EventsController < ArtfullyOseController
2
2
  respond_to :html, :json, :js
3
3
 
4
- before_filter :find_event, :only => [ :show, :edit, :update, :destroy, :widget, :image, :storefront_link, :prices, :messages, :resell, :wp_plugin, :passes ]
4
+ before_filter :find_event, :only => [ :show, :edit, :update, :destroy, :widget, :image, :storefront_link, :prices, :messages, :resell, :wp_plugin, :passes, :seating ]
5
5
  before_filter :upcoming_shows, :only => :show
6
6
  before_filter { authorize! :view, @event if @event }
7
7
 
8
8
  def create
9
9
  @event = Event.new(params[:event])
10
- @templates = current_organization.charts.template
11
10
  @event.organization_id = current_organization.id
12
11
  @event.is_free = !(current_organization.can? :access, :paid_ticketing)
13
- @event.venue.organization_id = current_organization.id
14
- @event.venue.time_zone = current_organization.time_zone
12
+
13
+ venue = Venue.most_recently_named(current_organization, params[:event][:venue_attributes][:name])
14
+
15
+ if venue
16
+ @event.venue = venue.dup
17
+ @event.set_default_chart(venue.default_chart.dup!({:save => true}))
18
+ else
19
+ @event.venue.organization_id = current_organization.id
20
+ @event.venue.time_zone = current_organization.time_zone
21
+ end
22
+
15
23
  @event.contact_email = current_organization.try(:email) || current_user.email
16
24
 
17
25
  if @event.save
@@ -54,8 +62,8 @@ class EventsController < ArtfullyOseController
54
62
  def new
55
63
  @event = current_organization.events.build(:producer => current_organization.name)
56
64
  @event.venue = Venue.new
65
+ @venue_names = current_organization.venues.pluck(:name).uniq.sort
57
66
  authorize! :new, @event
58
- @templates = current_organization.charts.template
59
67
  end
60
68
 
61
69
  def edit
@@ -107,6 +115,9 @@ class EventsController < ArtfullyOseController
107
115
  def prices
108
116
  end
109
117
 
118
+ def seating
119
+ end
120
+
110
121
  def passes
111
122
  end
112
123
 
@@ -5,13 +5,15 @@ class ExchangesController < ArtfullyOseController
5
5
  @person = @order.person
6
6
 
7
7
  if @items.all?(&:exchangeable?)
8
- @events = current_organization.events.sort
8
+ @events = upcoming_events
9
9
 
10
10
  unless params[:event_id].blank?
11
11
  @event = Event.find(params[:event_id])
12
12
  @shows = @event.upcoming_shows(:all)
13
13
  unless params[:show_id].blank? || @event.blank?
14
- @show = Show.includes(:event => :venue, :chart => [:sections => :ticket_types]).find(params[:show_id])
14
+ @show = Show.includes(:event => :venue).find(params[:show_id])
15
+ @chart = Chart.find(@show.chart_id)
16
+ @chart = Chart.includes(@chart.class.included_models).find(@show.chart_id)
15
17
  unless params[:ticket_type_id].blank? || @show.blank?
16
18
  @ticket_type = TicketType.find(params[:ticket_type_id])
17
19
  @num_available_tickets = @ticket_type.available
@@ -29,14 +31,25 @@ class ExchangesController < ArtfullyOseController
29
31
  order = Order.find(params[:order_id])
30
32
  items = params[:items].collect { |item_id| Item.find(item_id) }
31
33
  ticket_type = TicketType.find(params[:ticket_type_id])
32
- tickets = ticket_type.available_tickets(items.count)
34
+
35
+ if params[:seat_id].present?
36
+ @tickets = current_organization.tickets.includes(:seat).where(:seat_id => params[:seat_id])
37
+ @seats = @tickets.collect(&:seat)
38
+ @selected_tickets_available = @seats.collect(&:available_for_purchase).reduce{|r,e| r && e}
39
+ else
40
+ @tickets, error = ticket_type.available_tickets(items.count)
41
+ end
42
+
33
43
  logger.debug("Beginning exchange")
34
- @exchange = Exchange.new(order, items, tickets, ticket_type, send_email_confirmation?)
44
+ @exchange = Exchange.new(order, items, @tickets, ticket_type, send_email_confirmation?)
35
45
 
36
- if tickets.nil?
46
+ if @tickets.nil?
37
47
  flash[:error] = "Please select tickets to exchange."
38
48
  redirect_to :back
39
- elsif tickets.size != items.size
49
+ elsif !@selected_tickets_available
50
+ flash[:error] = "Sorry, one or more of your seats is not available for this ecahnge. Please select different seats."
51
+ redirect_to :back
52
+ elsif @tickets.size != items.size
40
53
  flash[:error] = "There were not enough tickets available for this show. (#{items.size} needed, #{tickets.size} available.)"
41
54
  redirect_to :back
42
55
  elsif @exchange.valid?
@@ -50,7 +63,17 @@ class ExchangesController < ArtfullyOseController
50
63
  end
51
64
  end
52
65
 
53
- def send_email_confirmation?
54
- params[:send_email_confirmation] == "1"
55
- end
66
+ private
67
+ def send_email_confirmation?
68
+ params[:send_email_confirmation] == "1"
69
+ end
70
+
71
+ def upcoming_events
72
+ Event.unscoped.where(:deleted_at => nil)
73
+ .where(:organization_id => current_organization.id)
74
+ .where(:id => current_organization.shows.unplayed.pluck(:event_id).uniq)
75
+ .joins(:shows)
76
+ .order('name ASC')
77
+ .uniq
78
+ end
56
79
  end
@@ -29,4 +29,12 @@ class ExportController < ArtfullyOseController
29
29
  send_data @csv_string, :filename => @filename, :type => "text/csv", :disposition => "attachment"
30
30
  end
31
31
 
32
+ def all_sales
33
+ @organization = current_user.current_organization
34
+ @filename = "Artfully-Sales-Export-#{DateTime.now.strftime("%m-%d-%y")}.csv"
35
+ @items = ItemView.where(:organization_id => current_organization).where("product_type in('Ticket', 'Pass', 'Membership')").all
36
+ @csv_string = @items.to_comma(:all_sales)
37
+ send_data @csv_string, :filename => @filename, :type => "text/csv", :disposition => "attachment"
38
+ end
39
+
32
40
  end