artfully_ose 1.2.0.pre.23 → 1.2.0.pre.24

Sign up to get free protection for your applications and to get access to all the features.
Files changed (241) hide show
  1. checksums.yaml +8 -8
  2. data/app/assets/javascripts/application.js +44 -11
  3. data/app/assets/javascripts/custom/inline-people-search.js +40 -40
  4. data/app/assets/javascripts/households.js +59 -0
  5. data/app/assets/javascripts/jquery-migrate-1.2.1.min.js +2 -0
  6. data/app/assets/javascripts/relationships.js +63 -0
  7. data/app/assets/stylesheets/application.sass +57 -10
  8. data/app/assets/stylesheets/sass/_event_list.sass +12 -1
  9. data/app/assets/stylesheets/sass/cart.sass +0 -6
  10. data/app/assets/stylesheets/storefront.css +1 -0
  11. data/app/concerns/pdf_generation.rb +4 -1
  12. data/app/controllers/events_controller.rb +11 -2
  13. data/app/controllers/events_pass_types_controller.rb +2 -0
  14. data/app/controllers/exchanges_controller.rb +1 -1
  15. data/app/controllers/households_controller.rb +71 -0
  16. data/app/controllers/member_cards_controller.rb +45 -0
  17. data/app/controllers/members/sessions_controller.rb +14 -0
  18. data/app/controllers/membership_comps_controller.rb +7 -2
  19. data/app/controllers/membership_types_controller.rb +8 -3
  20. data/app/controllers/mobile/orders_controller.rb +3 -2
  21. data/app/controllers/mobile/shows_controller.rb +6 -0
  22. data/app/controllers/mobile/tickets_controller.rb +32 -3
  23. data/app/controllers/mobile/users_controller.rb +11 -13
  24. data/app/controllers/orders_controller.rb +44 -2
  25. data/app/controllers/pass_types_controller.rb +11 -0
  26. data/app/controllers/passes_controller.rb +40 -1
  27. data/app/controllers/people_controller.rb +31 -15
  28. data/app/controllers/relationships_controller.rb +15 -0
  29. data/app/controllers/sales_controller.rb +12 -12
  30. data/app/controllers/searches_controller.rb +1 -1
  31. data/app/controllers/shows_controller.rb +10 -4
  32. data/app/controllers/slices_controller.rb +3 -2
  33. data/app/controllers/statements_controller.rb +1 -1
  34. data/app/controllers/store/memberships_controller.rb +5 -2
  35. data/app/controllers/store/orders_controller.rb +14 -13
  36. data/app/controllers/store/retrievals_controller.rb +29 -0
  37. data/app/helpers/artfully_ose_helper.rb +12 -4
  38. data/app/helpers/households_helper.rb +7 -0
  39. data/app/helpers/link_helper.rb +5 -5
  40. data/app/helpers/relationships_helper.rb +26 -0
  41. data/app/helpers/searches_helper.rb +13 -0
  42. data/app/helpers/suggested_households_helper.rb +5 -0
  43. data/app/mailers/pass_mailer.rb +17 -0
  44. data/app/models/ability.rb +1 -0
  45. data/app/models/actions/go_action.rb +3 -2
  46. data/app/models/address.rb +27 -13
  47. data/app/models/cart.rb +15 -0
  48. data/app/models/company.rb +1 -1
  49. data/app/models/database_views/item_view.rb +56 -13
  50. data/app/models/door_list.rb +6 -3
  51. data/app/models/event.rb +22 -1
  52. data/app/models/events_pass_type.rb +3 -1
  53. data/app/models/extendable.rb +6 -0
  54. data/app/models/household.rb +61 -0
  55. data/app/models/household_suggester.rb +58 -0
  56. data/app/models/imports/events_import.rb +10 -5
  57. data/app/models/individual.rb +3 -1
  58. data/app/models/item.rb +3 -1
  59. data/app/models/job/cleanup_suggested_households_job.rb +17 -0
  60. data/app/models/job/destroy_show_job.rb +10 -0
  61. data/app/models/job/geocode_address_job.rb +11 -0
  62. data/app/models/job/order_processor.rb +20 -8
  63. data/app/models/job/refund_order_processor.rb +16 -0
  64. data/app/models/kit.rb +1 -1
  65. data/app/models/kits/mailchimp_kit.rb +5 -3
  66. data/app/models/kits/membership_kit.rb +1 -1
  67. data/app/models/member.rb +19 -0
  68. data/app/models/member_card_generator.rb +63 -0
  69. data/app/models/member_walkup.rb +150 -0
  70. data/app/models/membership.rb +2 -5
  71. data/app/models/membership_comp.rb +1 -0
  72. data/app/models/membership_sale_search.rb +36 -0
  73. data/app/models/membership_type.rb +8 -2
  74. data/app/models/order.rb +32 -2
  75. data/app/models/order_handler.rb +58 -41
  76. data/app/models/orders/refund_order.rb +4 -0
  77. data/app/models/organization.rb +5 -0
  78. data/app/models/organization_ability.rb +1 -0
  79. data/app/models/pass.rb +143 -5
  80. data/app/models/pass_summary.rb +18 -0
  81. data/app/models/pass_type.rb +7 -1
  82. data/app/models/person.rb +83 -32
  83. data/app/models/relation.rb +27 -0
  84. data/app/models/relation_builder.rb +32 -0
  85. data/app/models/relationship.rb +55 -0
  86. data/app/models/relationship_builder.rb +12 -0
  87. data/app/models/relationship_validator.rb +46 -0
  88. data/app/models/relationships_kit.rb +31 -0
  89. data/app/models/search.rb +152 -57
  90. data/app/models/show.rb +38 -18
  91. data/app/models/slices.rb +25 -8
  92. data/app/models/statement.rb +32 -5
  93. data/app/models/suggested_household.rb +24 -0
  94. data/app/models/ticket.rb +1 -4
  95. data/app/models/ticket/locker.rb +2 -1
  96. data/app/models/ticket/pricing.rb +10 -1
  97. data/app/models/ticket_type.rb +12 -1
  98. data/app/models/valuation/lifetime_memberships.rb +24 -0
  99. data/app/models/valuation/lifetime_ticket_value.rb +1 -1
  100. data/app/models/venue.rb +21 -7
  101. data/app/views/actions/_form.html.haml +6 -6
  102. data/app/views/actions/get/_show.html.haml +1 -1
  103. data/app/views/actions/give/_show.html.haml +1 -1
  104. data/app/views/actions/shared/_show.html.haml +1 -1
  105. data/app/views/discounts/_discount_section_fields.html.haml +1 -1
  106. data/app/views/discounts/index.html.haml +1 -1
  107. data/app/views/events/_day_date_show.html.haml +2 -2
  108. data/app/views/events/_discount_section_fields.html.haml +1 -1
  109. data/app/views/events/_list.html.haml +10 -5
  110. data/app/views/events/_menu.html.haml +5 -5
  111. data/app/views/events/_section_fields.html.haml +1 -1
  112. data/app/views/events/_ticket_type_fields.html.haml +2 -2
  113. data/app/views/events/index.html.haml +20 -3
  114. data/app/views/events/temp_discount_form.html.haml +1 -1
  115. data/app/views/events/temp_discounts_index.html.haml +1 -1
  116. data/app/views/events_pass_types/_form.html.haml +17 -0
  117. data/app/views/events_pass_types/index.html.haml +5 -2
  118. data/app/views/exchanges/new.html.haml +1 -1
  119. data/app/views/households/_action.html.haml +24 -0
  120. data/app/views/households/_edit_modal.html.haml +143 -0
  121. data/app/views/households/_form.html.haml +26 -0
  122. data/app/views/households/_header.html.haml +25 -0
  123. data/app/views/households/_individual_fields.html.haml +8 -0
  124. data/app/views/households/_list.html.haml +10 -0
  125. data/app/views/households/_note.html.haml +33 -0
  126. data/app/views/households/edit.html.haml +1 -0
  127. data/app/views/households/index.html.haml +13 -0
  128. data/app/views/households/new.html.haml +14 -0
  129. data/app/views/households/show.html.haml +72 -0
  130. data/app/views/households/suggested.html.haml +38 -0
  131. data/app/views/imports/donations/_pending.html.haml +1 -1
  132. data/app/views/imports/events/_pending.html.haml +1 -1
  133. data/app/views/imports/people/_imported.html.haml +2 -2
  134. data/app/views/imports/people/_new.html.haml +3 -3
  135. data/app/views/imports/people/_pending.html.haml +2 -2
  136. data/app/views/imports/people/_recalled.html.haml +1 -1
  137. data/app/views/imports/shared/_sidebar.html.haml +1 -1
  138. data/app/views/index/dashboard.html.haml +4 -4
  139. data/app/views/layouts/_flash.html.haml +2 -2
  140. data/app/views/layouts/_menu.html.haml +2 -0
  141. data/app/views/layouts/storefront.html.haml +1 -1
  142. data/app/views/members/index/index.html.haml +1 -1
  143. data/app/views/membership_comps/confirm.html.haml +4 -3
  144. data/app/views/membership_comps/new.html.haml +21 -8
  145. data/app/views/membership_types/_form.html.haml +11 -0
  146. data/app/views/membership_types/index.html.haml +2 -2
  147. data/app/views/membership_types/type.html.haml +7 -4
  148. data/app/views/memberships/index.html.haml +7 -7
  149. data/app/views/merges/find_person.html.haml +1 -1
  150. data/app/views/notes/_note.html.haml +4 -4
  151. data/app/views/order_mailer/confirmation_for_refund.html.haml +8 -1
  152. data/app/views/orders/_item_table.haml +18 -5
  153. data/app/views/orders/_order_sidebar.html.haml +1 -1
  154. data/app/views/orders/membership.html.haml +104 -0
  155. data/app/views/orders/sales.html.haml +1 -1
  156. data/app/views/organizations/_form.html.haml +1 -1
  157. data/app/views/pass_mailer/pass_info_for.html.haml +21 -0
  158. data/app/views/pass_types/_form.html.haml +6 -0
  159. data/app/views/pass_types/_pass_type_fees.html.haml +0 -48
  160. data/app/views/pass_types/index.html.haml +4 -2
  161. data/app/views/passes/index.html.haml +95 -27
  162. data/app/views/pdfs/member_card_generator/blanks_usa_idc6.html.haml +109 -0
  163. data/app/views/people/_edit_modal.html.haml +35 -25
  164. data/app/views/people/_header.html.haml +10 -6
  165. data/app/views/people/_household_fields.html.haml +5 -0
  166. data/app/views/people/_phone_fields.html.haml +1 -1
  167. data/app/views/people/_relationship_fields.html.haml +14 -0
  168. data/app/views/people/_work_with_menu.html.haml +36 -0
  169. data/app/views/people/new.html.haml +1 -1
  170. data/app/views/people/show.html.haml +46 -8
  171. data/app/views/refunds/new.html.haml +4 -0
  172. data/app/views/relationships/index.html.haml +32 -0
  173. data/app/views/reports_mailer/daily.html.haml +41 -38
  174. data/app/views/sales/new.html.haml +1 -1
  175. data/app/views/searches/_form.html.haml +65 -17
  176. data/app/views/searches/_household.html.haml +7 -0
  177. data/app/views/searches/_person.html.haml +5 -2
  178. data/app/views/searches/new.html.haml +1 -1
  179. data/app/views/searches/show.html.haml +13 -5
  180. data/app/views/segments/show.html.haml +3 -3
  181. data/app/views/shared/_tags.html.haml +1 -1
  182. data/app/views/shows/_glance.html.haml +1 -1
  183. data/app/views/shows/_sections_table.html.haml +2 -2
  184. data/app/views/shows/_ticket_table.html.haml +1 -1
  185. data/app/views/shows/_work_with.html.haml +2 -2
  186. data/app/views/shows/door_list.html.haml +2 -2
  187. data/app/views/shows/door_list.pdf.haml +29 -0
  188. data/app/views/shows/index.html.haml +1 -1
  189. data/app/views/shows/show.html.haml +1 -1
  190. data/app/views/slices/index.html.haml +2 -1
  191. data/app/views/statements/_discounts_table.html.haml +1 -1
  192. data/app/views/statements/_order_location_table.html.haml +1 -1
  193. data/app/views/statements/_passes_table.html.haml +13 -16
  194. data/app/views/statements/_payment_method_table.haml +1 -1
  195. data/app/views/statements/_ticket_type_table.haml +5 -2
  196. data/app/views/statements/show.html.haml +2 -2
  197. data/app/views/store/checkouts/thanks.html.haml +3 -2
  198. data/app/views/store/events/index.html.haml +1 -1
  199. data/app/views/store/memberships/index.html.haml +9 -2
  200. data/app/views/store/orders/show.html.haml +10 -24
  201. data/app/views/store/passes/index.html.haml +1 -1
  202. data/app/views/store/retrievals/index.html.haml +11 -0
  203. data/app/views/store/shows/_show.html.haml +2 -2
  204. data/app/views/venues/edit.html.haml +3 -1
  205. data/config/routes.rb +21 -3
  206. data/db/migrate/20130916194547_add_relationships.rb +21 -0
  207. data/db/migrate/20131003134821_add_relationships_to_search.rb +7 -0
  208. data/db/migrate/20131003200508_add_starred_to_relationships.rb +5 -0
  209. data/db/migrate/20131015151550_add_households.rb +18 -0
  210. data/db/migrate/20131022183913_add_search_output_options.rb +24 -0
  211. data/db/migrate/20131025162155_default_search_filter_values.rb +10 -0
  212. data/db/migrate/20131025180139_unique_household_names.rb +8 -0
  213. data/db/migrate/20131106191847_add_suggested_households.rb +13 -0
  214. data/db/migrate/20131204162642_add_shared_address.rb +9 -0
  215. data/db/migrate/20131212164553_add_copy_to_individuals_option.rb +5 -0
  216. data/db/migrate/20140415212841_add_min_max_start_dates_to_searches.artfully_ose_engine.rb +6 -0
  217. data/db/migrate/20140422193345_add_email_copy_to_pass_type.rb +5 -0
  218. data/db/migrate/20140423181639_add_min_max_end_dates_to_searches.artfully_ose_engine.rb +6 -0
  219. data/db/migrate/20140423185921_add_cached_stats_to_event.rb +9 -0
  220. data/db/migrate/20140424174423_add_lifetime_memberships_to_people.artfully_ose_engine.rb +5 -0
  221. data/db/migrate/20140506155241_add_lpt_to_membership_type.rb +5 -0
  222. data/db/migrate/20140515143651_remove_show_stats_view.rb +6 -0
  223. data/db/migrate/20140521195853_add_deleted_at_to_pass_type.rb +5 -0
  224. data/db/migrate/20140522205554_add_limit_to_events_pass_types.rb +5 -0
  225. data/db/migrate/20140523180444_remove_tickets_purchased_from_passes.rb +5 -0
  226. data/lib/artfully_ose/common_abilities.rb +7 -1
  227. data/lib/artfully_ose/version.rb +1 -1
  228. data/spec/factories/household_factories.rb +8 -0
  229. data/spec/factories/organization_factories.rb +4 -0
  230. data/spec/factories/pass_type_factories.rb +11 -0
  231. data/spec/factories/user_factories.rb +1 -1
  232. metadata +92 -11
  233. data/app/assets/fonts/FontAwesome.otf +0 -0
  234. data/app/assets/fonts/fontawesome-webfont.eot +0 -0
  235. data/app/assets/fonts/fontawesome-webfont.svg +0 -284
  236. data/app/assets/fonts/fontawesome-webfont.ttf +0 -0
  237. data/app/assets/fonts/fontawesome-webfont.woff +0 -0
  238. data/app/assets/stylesheets/font-awesome.sass +0 -759
  239. data/app/models/show_stats_view.rb +0 -10
  240. data/app/models/show_touch.rb +0 -12
  241. data/app/views/people/_comp_membership.html.haml +0 -23
@@ -29,4 +29,15 @@ ul#event-list
29
29
  margin-bottom: 3px
30
30
  color: white
31
31
  a:hover
32
- text-decoration: none
32
+ text-decoration: none
33
+
34
+ .no-events-found
35
+ h3
36
+ text-align: center
37
+
38
+ .event-list-controls
39
+ .btn-group
40
+ margin-bottom: 0
41
+
42
+ form
43
+ margin-bottom: 0
@@ -34,12 +34,6 @@ a
34
34
  margin-top: 0
35
35
  margin-bottom: 0
36
36
 
37
- #controls
38
- @extend .stack1of4
39
-
40
- #cart
41
- @extend .stack3of4
42
-
43
37
  #total
44
38
  text-align: center
45
39
  font-weight: bold
@@ -2,5 +2,6 @@
2
2
  *= require bootstrap
3
3
  *= require sass/cart
4
4
  *= require sass/store
5
+ *= require font-awesome
5
6
  *= require_self
6
7
  */
@@ -6,11 +6,14 @@ class PdfGeneration
6
6
  PDF_GET_URL = "http://quick-pdf.geminisbs.net/pdfs/:id.json?api_key=:key"
7
7
  PDF_DOWNLOAD_URL = "http://quick-pdf.geminisbs.net/pdfs/:id/download?api_key=:key"
8
8
 
9
+ attr_accessor :pdf_options
10
+
9
11
  def initialize(pdfable, pdf_api_key = PDF_API_KEY, http_party = HTTParty, sleeper = Kernel)
10
12
  @pdfable = pdfable
11
13
  @pdf_api_key = pdf_api_key
12
14
  @http_party = http_party
13
15
  @sleeper = sleeper
16
+ @pdf_options = {}
14
17
  end
15
18
 
16
19
  def generate
@@ -51,7 +54,7 @@ class PdfGeneration
51
54
  :margin_bottom => "0.5in",
52
55
  :margin_left => "0.5in",
53
56
  :margin_right => "0.5in"
54
- }
57
+ }.merge(pdf_options)
55
58
  }
56
59
  }
57
60
  }
@@ -1,5 +1,5 @@
1
1
  class EventsController < ArtfullyOseController
2
- respond_to :html, :json
2
+ respond_to :html, :json, :js
3
3
 
4
4
  before_filter :find_event, :only => [ :show, :edit, :update, :destroy, :widget, :image, :storefront_link, :prices, :messages, :resell, :wp_plugin, :passes ]
5
5
  before_filter :upcoming_shows, :only => :show
@@ -23,7 +23,16 @@ class EventsController < ArtfullyOseController
23
23
 
24
24
  def index
25
25
  authorize! :view, Event
26
- @events = current_organization.events.includes(:shows, :tickets).order('updated_at DESC')
26
+
27
+ scope = Event.unscoped.where(:deleted_at => nil).where(:organization_id => current_organization.id).includes(:shows).order('name ASC')
28
+ scope = if params[:range].present? && params[:range] == 'all'
29
+ @all = scope
30
+ else
31
+ @upcoming = scope.where :id => current_organization.shows.unplayed.pluck(:event_id).uniq
32
+ end
33
+
34
+ scope = scope.where('LOWER(name) LIKE ?', "%#{params[:query].downcase}%") unless params[:query].blank?
35
+ @events = scope
27
36
  end
28
37
 
29
38
  def show
@@ -25,6 +25,7 @@ class EventsPassTypesController < ArtfullyOseController
25
25
  @events_pass_type = EventsPassType.new.tap do |ept|
26
26
  ept.organization = current_organization
27
27
  ept.event = @event
28
+ ept.limit_per_pass = params[:events_pass_type][:limit_per_pass]
28
29
  ept.pass_type = current_organization.pass_types.find(params[:events_pass_type][:pass_type])
29
30
  ept.ticket_types = Set.new(params[:events_pass_type][:ticket_types].reject!(&:blank?))
30
31
  ept.excluded_shows = Set.new(params[:events_pass_type][:excluded_shows].reject!(&:blank?))
@@ -45,6 +46,7 @@ class EventsPassTypesController < ArtfullyOseController
45
46
 
46
47
  def update
47
48
  @events_pass_type = EventsPassType.find(params[:id])
49
+ @events_pass_type.limit_per_pass = params[:events_pass_type][:limit_per_pass]
48
50
  @events_pass_type.ticket_types = Set.new(params[:events_pass_type][:ticket_types].reject!(&:blank?))
49
51
  @events_pass_type.excluded_shows = Set.new(params[:events_pass_type][:excluded_shows].reject!(&:blank?))
50
52
  @events_pass_type.active = params[:events_pass_type][:active]
@@ -5,7 +5,7 @@ class ExchangesController < ArtfullyOseController
5
5
  @person = @order.person
6
6
 
7
7
  if @items.all?(&:exchangeable?)
8
- @events = current_organization.events
8
+ @events = current_organization.events.sort
9
9
 
10
10
  unless params[:event_id].blank?
11
11
  @event = Event.find(params[:event_id])
@@ -0,0 +1,71 @@
1
+ class HouseholdsController < ArtfullyOseController
2
+
3
+ respond_to :html
4
+
5
+ def new
6
+ @household = Household.new
7
+ if params[:individuals]
8
+ params[:individuals].each do |i|
9
+ @household.individuals << current_organization.individuals.find(i)
10
+ end
11
+ end
12
+ end
13
+
14
+ def update
15
+ @household = current_organization.households.find(params[:id])
16
+ flash[:notice] = []
17
+
18
+ unless params[:individual_ids].nil?
19
+ @household.individuals << current_organization.individuals.find(params[:individual_ids])
20
+ end
21
+
22
+ @household.update_attributes(params[:household])
23
+ @household.update_member_addresses if @household.overwrite_member_addresses
24
+
25
+ if @household.save
26
+ flash[:notice] = "Your changes have been saved"
27
+ else
28
+ flash[:alert] = @household.errors.full_messages.to_sentence
29
+ end
30
+
31
+ redirect_to(@household)
32
+ end
33
+
34
+ def create
35
+ @household = current_organization.households.create(params[:household])
36
+
37
+ # NOTE: No mind is paid to any household these people might already be in
38
+ params[:individuals].reject(&:empty?).each do |i|
39
+ @household.individuals << current_organization.individuals.find(i)
40
+ end
41
+
42
+ if @household.save
43
+ redirect_to @household
44
+ else
45
+ render :new
46
+ end
47
+ end
48
+
49
+ def show
50
+ @household = current_organization.households.find(params[:id])
51
+ @actions = @household.actions.includes(:person, :organization).paginate(:page => params[:page], :per_page => 20)
52
+ end
53
+
54
+ def index
55
+ @households = current_organization.households.order(:created_at)
56
+ @households = @households.paginate(:page => params[:page], :per_page => 20)
57
+ end
58
+
59
+ def suggested
60
+ hs = HouseholdSuggester.new(current_organization)
61
+ @by_address = hs.by_address
62
+ @by_spouse = hs.by_spouse
63
+ end
64
+
65
+ def ignore_suggested
66
+ suggested = SuggestedHousehold.find(params[:suggested_id])
67
+ suggested.update_attributes(:ignored => true)
68
+ redirect_to suggested_households_path
69
+ end
70
+
71
+ end
@@ -0,0 +1,45 @@
1
+ class MemberCardsController < ArtfullyOseController
2
+ requires_kit :membership
3
+
4
+ before_filter :find_members
5
+
6
+ def new
7
+ generator = MemberCardGenerator::BlanksUsaIdc6.new(@members)
8
+ generator.generate
9
+ redirect_to generator.download_url
10
+ end
11
+
12
+ private
13
+ def find_members
14
+ @members = if params[:search_id].present?
15
+ search = Search.where(:id => params[:search_id]).first
16
+ if search
17
+ load_members search.people.map { |person| person.memberships.current.first.member_id }
18
+ else
19
+ raise CanCan::AccessDenied
20
+ end
21
+ elsif params[:start].present?
22
+ members_from_sales_search
23
+ else
24
+ raise CanCan::AccessDenied
25
+ end
26
+ end
27
+
28
+ def load_members(member_ids)
29
+ Member.find Array.wrap(member_ids).flatten
30
+ end
31
+
32
+ def members_from_sales_search
33
+ membership_type = MembershipType.find_by_id(params[:membership_type_id]) if params[:membership_type_id].present?
34
+ search = MembershipSaleSearch.new :start => params[:start],
35
+ :stop => params[:stop],
36
+ :organization => current_organization,
37
+ :membership_type => membership_type
38
+
39
+ load_members search.results.map { |order| order.items.select(&:membership?).first.product.member_id }
40
+ end
41
+
42
+ def sales_params?
43
+ params[:start].present?
44
+ end
45
+ end
@@ -0,0 +1,14 @@
1
+ class Members::SessionsController < Devise::SessionsController
2
+ layout 'devise_layout'
3
+
4
+ def new
5
+ # Store the referrer so we can send them back
6
+ # where they started after successful sign in.
7
+ session[:continue] = request.referrer
8
+ super
9
+ end
10
+
11
+ def after_sign_in_path_for(resource_or_scope)
12
+ stored_location_for(resource_or_scope) || session.delete(:continue) || signed_in_root_path(resource_or_scope)
13
+ end
14
+ end
@@ -4,7 +4,7 @@ class MembershipCompsController < ArtfullyOseController
4
4
  def new
5
5
  @membership_types = current_organization.membership_types.all
6
6
  @membership_types_hash = {}
7
- @membership_types.each {|mt| @membership_types_hash[mt.id] = I18n.l(mt.ends_at, :format => :date_for_input)}
7
+ @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)}}
8
8
 
9
9
  @membership_comp = MembershipComp.new
10
10
  @membership_comp.membership_type ||= @membership_types.first
@@ -30,6 +30,11 @@ class MembershipCompsController < ArtfullyOseController
30
30
  @membership_comp.award
31
31
  render 'create' and return
32
32
  else
33
+ unless params[:membership_comp][:membership_type].present?
34
+ flash[:error] = "Please select a membership type"
35
+ redirect_to :back and return
36
+ end
37
+
33
38
  @number_without_emails = @membership_comp.people.select{ |person| person.email.blank? }.length
34
39
  @number_of_companies = @membership_comp.people.select{ |person| person.company? }.length
35
40
  @email_preview = generate_invitation_preview_for(@membership_comp)
@@ -58,7 +63,7 @@ class MembershipCompsController < ArtfullyOseController
58
63
  def from_params(params)
59
64
  membership_comp = MembershipComp.new
60
65
  membership_comp_params = params[:membership_comp]
61
- membership_comp.membership_type = MembershipType.find(membership_comp_params[:membership_type])
66
+ membership_comp.membership_type = MembershipType.find(membership_comp_params[:membership_type]) if membership_comp_params[:membership_type].present?
62
67
  membership_comp.ends_at = membership_comp_params[:ends_at]
63
68
  membership_comp.send_email = membership_comp_params[:send_email] == "true"
64
69
  membership_comp.number_of_memberships = membership_comp_params[:number_of_memberships]
@@ -39,9 +39,14 @@ class MembershipTypesController < ArtfullyOseController
39
39
 
40
40
  def update
41
41
  @membership_type = MembershipType.find(params[:id])
42
- @membership_type.update_attributes(params[:membership_type])
43
- flash[:notice] = "Your changes have been saved"
44
- redirect_to membership_types_path
42
+
43
+ if @membership_type.update_attributes(params[:membership_type])
44
+ flash[:notice] = "Your changes have been saved"
45
+ redirect_to membership_types_path
46
+ else
47
+ flash[:error] = @membership_type.errors.full_messages.to_sentence
48
+ render "edit" and return
49
+ end
45
50
  end
46
51
 
47
52
  private
@@ -30,7 +30,8 @@ class Mobile::OrdersController < ApplicationController
30
30
  def index
31
31
  organization = current_user.organizations.find(params[:organization_id])
32
32
  show = organization.shows.find(params[:show_id])
33
- orders = show.items.map(&:order).uniq
33
+ door_list = DoorList.new(show)
34
+ orders = Order.find(door_list.items.collect(&:order_id).uniq)
34
35
  render :json => orders, :each_serializer => OrderSerializer
35
36
  end
36
37
 
@@ -55,6 +56,6 @@ class Mobile::OrdersController < ApplicationController
55
56
  end
56
57
  end
57
58
 
58
- render :json => order, :serializer => OrderSerializer
59
+ render :json => order, :serializer => OrderValidationSerializer
59
60
  end
60
61
  end
@@ -18,6 +18,12 @@ class Mobile::ShowsController < ApplicationController
18
18
  end
19
19
  end
20
20
 
21
+ def show
22
+ organization = current_user.organizations.find(params[:organization_id])
23
+ show = organization.shows.find(params[:id])
24
+ render :json => show, :serializer => ShowSerializer
25
+ end
26
+
21
27
  def index
22
28
  organization = current_user.organizations.find(params[:organization_id])
23
29
  event = organization.events.find(params[:event_id])
@@ -38,6 +38,24 @@ class Mobile::TicketsController < ApplicationController
38
38
  }, :status => 400
39
39
  end
40
40
 
41
+ rescue_from MemberWalkup::TicketTypeNotFound do |e|
42
+ error = {
43
+ :error => 'Could not find member only ticket type',
44
+ :reason => e.message,
45
+ :code => 9
46
+ }
47
+ render :json => error, :status => 404
48
+ end
49
+
50
+ rescue_from MemberWalkup::TicketsNotAvailable do |e|
51
+ error = {
52
+ :error => 'Could not find available tickets',
53
+ :reason => e.message,
54
+ :code => 10
55
+ }
56
+ render :json => error, :status => 404
57
+ end
58
+
41
59
  def show
42
60
  organization = current_user.organizations.find_by_id(params[:organization_id])
43
61
  raise OrganizationNotFound, "Could not load ticket" if !organization
@@ -60,14 +78,25 @@ class Mobile::TicketsController < ApplicationController
60
78
  def validate
61
79
  organization = current_user.organizations.find_by_id(params[:organization_id])
62
80
  raise OrganizationNotFound, "Could not update ticket" if !organization
81
+
63
82
  ticket = organization.tickets.where(:show_id => params[:show_id], :uuid => params[:id]).first
64
- raise TicketNotFound, "Could not update ticket" if !ticket
83
+ if !ticket
84
+ # Try a member walkup
85
+ walkup = MemberWalkup.new(:show_id => params[:show_id], :member_uuid => params[:id])
86
+
87
+ if walkup.valid?
88
+ walkup.save
89
+ ticket = walkup.ticket
90
+ end
91
+
92
+ raise TicketNotFound, "Could not update ticket" unless ticket
93
+ end
65
94
 
66
95
  if !ticket.validate_ticket!(current_user)
67
96
  raise TicketAlreadyValidated
68
97
  end
69
98
 
70
- render :json => ticket.sold_item.try(:order), :serializer => OrderSerializer
99
+ render :json => ticket.sold_item.try(:order), :serializer => OrderValidationSerializer
71
100
  end
72
101
 
73
102
  def unvalidate
@@ -80,6 +109,6 @@ class Mobile::TicketsController < ApplicationController
80
109
  raise TicketNotValidated
81
110
  end
82
111
 
83
- render :json => ticket.sold_item.try(:order), :serializer => OrderSerializer
112
+ render :json => ticket.sold_item.try(:order), :serializer => OrderValidationSerializer
84
113
  end
85
114
  end
@@ -1,25 +1,23 @@
1
1
  class Mobile::UsersController < ApplicationController
2
2
  skip_before_filter :authenticate_user!, :only => :sign_in
3
3
 
4
- rescue_from ActiveRecord::RecordNotFound do
5
- error = {
6
- :error => "Could not sign in",
7
- :reason => "Organization could not be found",
8
- :code => 2
9
- }
10
- render :json => error, :status => 404
11
- end
12
-
13
4
  def sign_in
14
5
  user = User.find_by_email(params[:email])
15
6
 
16
7
  if user && user.valid_password?(params[:password])
17
- if params[:organization_id]
18
- now = Time.parse(params[:now]) rescue Time.zone.now
19
- organization = user.organizations.find(params[:organization_id])
8
+
9
+ if user.organizations.empty?
10
+ error = {
11
+ :error => "Could not sign in",
12
+ :reason => "User is not a member of any organizations",
13
+ :code => 2
14
+ }
15
+ render :json => error, :status => 422 and return
20
16
  end
21
17
 
22
- render :json => user, :auth_token => true, :organization => organization, :now => now
18
+ now = Time.parse(params[:now]) rescue Time.zone.now
19
+
20
+ render :json => user, :auth_token => true, :organization => user.organizations.first, :now => now
23
21
  else
24
22
  error = {
25
23
  :error => "Could not sign in",
@@ -47,12 +47,54 @@ class OrdersController < ArtfullyOseController
47
47
  redirect_to order_url(@order)
48
48
  end
49
49
 
50
+ def membership
51
+ authorize! :view, Order
52
+
53
+ @organization = current_organization
54
+ @membership_type = MembershipType.find_by_id(params[:membership_type_id]) if params[:membership_type_id].present?
55
+ @membership_types = @organization.membership_types
56
+
57
+ request.format = :csv if params[:commit] == "Download"
58
+
59
+ search_terms = {
60
+ :start => params[:start],
61
+ :stop => params[:stop],
62
+ :organization => @organization,
63
+ :membership_type => @membership_type
64
+ }
65
+
66
+ @search = MembershipSaleSearch.new(search_terms) do |results|
67
+ results.paginate(:page => params[:page], :per_page => 25)
68
+ end
69
+
70
+ respond_to do |format|
71
+ format.html
72
+ format.csv do
73
+ filename = "Artfully-Membership-Sales-Export-#{DateTime.now.strftime("%m-%d-%y")}.csv"
74
+ items = ItemView.where(:product_type => "Membership")
75
+ .where('items_view.created_at > ? ', @search.start)
76
+ .where('items_view.created_at < ?', @search.stop)
77
+ .where('items_view.organization_id = ?', current_organization)
78
+ .order('items_view.created_at desc')
79
+ if @membership_type
80
+ items = items.joins(:item).
81
+ joins("INNER JOIN memberships ON (items.product_type = #{::Item.sanitize('Membership')} AND items.product_id = memberships.id)").
82
+ joins("INNER JOIN membership_types ON (membership_types.id = memberships.membership_type_id)").
83
+ where(:membership_types => {:id => @membership_type}).
84
+ group('items_view.order_id')
85
+ end
86
+ csv_string = items.all.to_comma(:membership_sale)
87
+ send_data csv_string, :filename => filename, :type => "text/csv", :disposition => "attachment"
88
+ end
89
+ end
90
+ end
91
+
50
92
  def sales
51
93
  authorize! :view, Order
52
94
 
53
95
  @organization = current_organization
54
96
  @event = Event.find_by_id(params[:event_id]) if params[:event_id].present?
55
- @events = @organization.events
97
+ @events = @organization.events.sort
56
98
  @show = @event.shows.find_by_id(params[:show_id]) if @event && params[:show_id].present?
57
99
  @shows = @event.shows if @event
58
100
  request.format = :csv if params[:commit] == "Download"
@@ -74,7 +116,7 @@ class OrdersController < ArtfullyOseController
74
116
  format.csv do
75
117
  filename = "Artfully-Ticket-Sales-Export-#{DateTime.now.strftime("%m-%d-%y")}.csv"
76
118
  items = ItemView.where(:product_type => "Ticket")
77
- .where('created_at > ? ', search_terms[:start])
119
+ .where('created_at > ? ', search_terms[:start])
78
120
  .where('created_at < ?', Sundial.midnightish(current_organization, search_terms[:stop]))
79
121
  .where('organization_id = ?', current_organization)
80
122
  .order('created_at desc')