app/models/exchange.rb in artfully_ose-1.1.0 vs app/models/exchange.rb in artfully_ose-1.2.0.alpha.1
- old
+ new
@@ -1,27 +1,30 @@
class Exchange
- include Adjustments
include ActiveModel::Validations
- attr_accessor :order, :items, :tickets, :service_fee
+ attr_accessor :order, :items, :tickets, :ticket_type, :send_email_confirmation
+ attr_reader :exchange_order
- validates_presence_of :order
+ validates_presence_of :order
+ validates_presence_of :ticket_type
validates_length_of :items, :minimum => 1
validates_length_of :tickets, :minimum => 1
validate :items_are_exchangeable
validate :tickets_match_items
+ validate :legal_ticket_type
validate :tickets_are_available
validate :tickets_belong_to_organization
#The original order
#The items to exchange
#The tickets that they are being exchanged for
- def initialize(order, items, tickets = [])
+ def initialize(order, items, tickets, ticket_type, send_email_confirmation = false)
self.order = order
self.items = items
- self.tickets = tickets
- self.service_fee = number_of_non_free_items(items) * service_fee_per_item(order.items)
+ self.tickets = tickets || []
+ self.ticket_type = ticket_type
+ self.send_email_confirmation = send_email_confirmation
end
def items_are_exchangeable
errors.add(:items, "are not available to exchange") unless items.all?(&:exchangeable?)
end
@@ -38,41 +41,46 @@
errors.add(:tickets, "do not belong to this organization") unless tickets.all? { |ticket| order.organization.can? :manage, ticket }
end
def submit
ActiveRecord::Base.transaction do
+ self.tickets = Ticket.lock(self.tickets, self.ticket_type, Cart.create)
sell_new_items
return_old_items
- adjust_original_order
end
end
def return_old_items
items.map(&:exchange!)
end
- def adjust_original_order
- order.service_fee = order.service_fee - service_fee
- order.save
- end
-
def sell_new_items
exchange_order_timestamp = Time.now
- tickets.each { |ticket| ticket.exchange_to(order.person, exchange_order_timestamp) }
+ tickets.each_with_index do |ticket, index|
+ ticket.exchange_to(order.person, exchange_order_timestamp)
+ ticket.exchange_prices_from items[index].product
+ end
create_order(exchange_order_timestamp)
end
+ def legal_ticket_type
+ self.tickets.each do |ticket|
+ errors.add(:tickets, "cannot be assigned to this ticket type") unless ticket.can_be_assigned_to(self.ticket_type)
+ end
+ end
+
def create_order(time=Time.now)
exchange_order = ExchangeOrder.new.tap do |exchange_order|
exchange_order.person = order.person
exchange_order.parent = order
exchange_order.payment_method = order.payment_method
exchange_order.created_at = time
- exchange_order.service_fee = service_fee
exchange_order.for_organization order.organization
exchange_order.details = "Order is the result of an exchange on #{I18n.l time, :format => :slashed_date}"
+ exchange_order.skip_email = !send_email_confirmation
exchange_order << tickets
end
exchange_order.record_exchange! items
exchange_order.save!
+ @exchange_order = exchange_order
end
-end
\ No newline at end of file
+end