app/controllers/sales_controller.rb in artfully_ose-1.1.0 vs app/controllers/sales_controller.rb in artfully_ose-1.2.0.alpha.1

- old
+ new

@@ -1,81 +1,111 @@ class SalesController < ArtfullyOseController + include CartFinder before_filter :find_event, :find_show, :find_people, :find_dummy - before_filter :create_door_list, :only => ['show', 'new'] + before_filter :create_door_list, :only => ['show', 'new', 'door_list'] def show - redirect_to new_event_show_sales_path(@event, @show) + redirect_to new_event_show_sales_path(@event,@show,:render => 'boxoffice') end def new @person = Person.new - @sale = Sale.new(@show, @show.chart.sections.box_office) + @sale = Sale.new(@show, @show.chart.ticket_types.box_office, current_box_office_cart, {}) @tickets_remaining = tickets_remaining setup_defaults + response.headers["Cache-Control"] = "no-cache, no-store, max-age=0, must-revalidate" # http://stackoverflow.com/a/5493543/2063202 end - - # - # This needs a significant refactor. There is no way to maintain the sale object - # across requests. Because of this the number of locked tickets proliferates. - # - # Refactor this to maintain the cart across requests and clear the cart on successful sale - # - # In the meantime, BoxOffice::Cart has been jenked to just not lock tickets. - # def create - @sale = Sale.new(@show, @show.chart.sections.box_office, params[:quantities]) + current_box_office_cart.clear! + + @sale = Sale.new(@show, @show.chart.ticket_types.box_office, current_box_office_cart, params[:quantities], params[:order_notes]) + + # handle donation + if params[:donation].present? && params[:donation].to_i > 0 + donation = Donation.new + donation.amount = params[:donation].to_i * 100 + donation.organization_id = @event.organization_id + current_box_office_cart.donations << donation + end + + # handle discount + begin + discount = Discount.find_by_code_and_event_id(params[:discount].upcase, @event) + discount.apply_discount_to_cart(current_box_office_cart) + rescue RuntimeError => e + discount_error = e.message + rescue NoMethodError => e + discount_error = "We could not find your discount. Please try again." if params[:discount].present? + end + if checking_out? if @sale.sell(payment) - @sale.message = "Sold #{self.class.helpers.pluralize(@sale.tickets.length, 'ticket')}. Order total was #{self.class.helpers.number_as_cents @sale.cart.total}" + @sale.message = "Sold #{self.class.helpers.pluralize(@sale.tickets.length, 'ticket')}. Order total was #{self.class.helpers.number_as_cents @sale.order.total}" + + if params[:auto_check_in].present? + @sale.tickets.map {|t| t.reload; t.validate_ticket!(current_user)} + end end end unless @sale.errors.empty? @sale.error = "#{@sale.errors.full_messages.to_sentence.capitalize}." + flash[:error] = @sale.error + Ticket.unlock(@sale.tickets, @sale.cart) + render :js => "window.location = '#{new_event_show_sales_path(@event,@show,:render => 'boxoffice')}'" + return end - + render :json => @sale.as_json .merge(:total => @sale.cart.total) .merge(:tickets_remaining => tickets_remaining) - .merge(:door_list_rows => door_list_rows), + .merge(:door_list_rows => door_list_rows) + .merge(:discount_error => discount_error) + .merge(:discount_amount => current_box_office_cart.discount_amount), :status => 200 end def checking_out? - !params[:commit].blank? + params[:commit].present? end - + def door_list_rows door_list_rows = [] - - puts @sale.tickets.inspect - + @sale.tickets.each_with_index do |ticket, i| ticket.reload if ticket.sold? || ticket.comped? door_list_rows[i] = {} door_list_rows[i]['first_name'] = @sale.buyer.first_name door_list_rows[i]['last_name'] = @sale.buyer.last_name door_list_rows[i]['email'] = @sale.buyer.email - door_list_rows[i]['section'] = ticket.section.name + door_list_rows[i]['ticket_type'] = ticket.ticket_type.name + door_list_rows[i]['ticket_id'] = ticket.id door_list_rows[i]['payment_method'] = ticket.sold_item.order.payment_method door_list_rows[i]['price'] = ticket.sold_price end end door_list_rows end + def door_list + # create_door_list + render :partial => "sales/doorlist" + end + private + + # TODO: this should be pulled into TicketTypeSerializer def tickets_remaining remaining = {} - @sale.sections.each do |section| - remaining[section.id] = section.summary.available + @sale.ticket_types.each do |ticket_type| + remaining[ticket_type.id] = ticket_type.available("box_office") end remaining end - + def setup_defaults params[:anonymous] = true params[:cash] = true params[:credit_card] = {} end @@ -104,28 +134,62 @@ def find_dummy @dummy = Person.dummy_for(current_user.current_organization) end def person - params[:person_id].blank? ? @dummy : Person.find(params[:person_id]) + return @person unless @person.nil? + + #if there's a person_id, use find + @person = Person.find(params[:person][:id]) unless params[:person][:id].blank? + + if user_entered_nothing? + @person = @dummy + else + @person = Person.first_or_create(person_attributes) + end + + @person end - def payment + def person_attributes + { + :id => params[:person][:id], + :first_name => params[:person][:first_name], + :last_name => params[:person][:last_name], + :email => params[:person][:email], + :phones_attributes => params[:person][:phones_attributes], + :organization => current_organization + } + end + + def user_entered_nothing? + params[:person][:id].blank? && + params[:person][:first_name].blank? && + params[:person][:last_name].blank? && + params[:person][:email].blank? + end + + def payment if Swiper.can_parse? params[:credit_card][:number] swiped_data = Swiper.parse(params[:credit_card][:number]) params[:credit_card][:name] = swiped_data.track1.cardholder_name params[:credit_card][:number] = swiped_data.track1.primary_account_number params[:credit_card][:month] = swiped_data.track1.expiration_month params[:credit_card][:year] = swiped_data.track1.expiration_year end - + params[:benefactor] = current_user - - payment = Payment.create(params[:payment_method], params) + + # set payment as cash if total is 0 (e.g. free tickets) + if params[:payment_method].blank? && params[:total] == '0' + payment = Payment.create('cash', params) + else + payment = Payment.create(params[:payment_method], params) + end payment.customer = person payment end - + def has_card_info? params[:credit_card].present? and params[:credit_card][:card_number].present? end end