Class: Exchange

Inherits:
Object
  • Object
show all
Includes:
ActiveModel::Validations, Adjustments
Defined in:
app/models/exchange.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Adjustments

#number_of_non_free_items, #service_fee_per_item

Constructor Details

#initialize(order, items, tickets = []) ⇒ Exchange

The original order The items to exchange The tickets that they are being exchanged for



18
19
20
21
22
23
# File 'app/models/exchange.rb', line 18

def initialize(order, items, tickets = [])
  self.order        = order
  self.items        = items
  self.tickets      = tickets
  self.service_fee  = number_of_non_free_items(items) * service_fee_per_item(order.items)
end

Instance Attribute Details

#itemsObject

Returns the value of attribute items.



5
6
7
# File 'app/models/exchange.rb', line 5

def items
  @items
end

#orderObject

Returns the value of attribute order.



5
6
7
# File 'app/models/exchange.rb', line 5

def order
  @order
end

#service_feeObject

Returns the value of attribute service_fee.



5
6
7
# File 'app/models/exchange.rb', line 5

def service_fee
  @service_fee
end

#ticketsObject

Returns the value of attribute tickets.



5
6
7
# File 'app/models/exchange.rb', line 5

def tickets
  @tickets
end

Instance Method Details

#adjust_original_orderObject



53
54
55
56
# File 'app/models/exchange.rb', line 53

def adjust_original_order
  order.service_fee = order.service_fee - service_fee
  order.save
end

#create_order(time = Time.now) ⇒ Object



64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'app/models/exchange.rb', line 64

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 << tickets
  end
  exchange_order.record_exchange! items
  exchange_order.save!
end

#items_are_exchangeableObject



25
26
27
# File 'app/models/exchange.rb', line 25

def items_are_exchangeable
  errors.add(:items, "are not available to exchange") unless items.all?(&:exchangeable?)
end

#return_old_itemsObject



49
50
51
# File 'app/models/exchange.rb', line 49

def return_old_items
  items.map(&:exchange!)
end

#sell_new_itemsObject



58
59
60
61
62
# File 'app/models/exchange.rb', line 58

def sell_new_items
  exchange_order_timestamp = Time.now
  tickets.each { |ticket| ticket.exchange_to(order.person, exchange_order_timestamp) }
  create_order(exchange_order_timestamp)
end

#submitObject



41
42
43
44
45
46
47
# File 'app/models/exchange.rb', line 41

def submit
  ActiveRecord::Base.transaction do
    sell_new_items
    return_old_items
    adjust_original_order
  end
end

#tickets_are_availableObject



33
34
35
# File 'app/models/exchange.rb', line 33

def tickets_are_available
  errors.add(:tickets, "are not available to exchange") if tickets.any?(&:committed?)
end

#tickets_belong_to_organizationObject



37
38
39
# File 'app/models/exchange.rb', line 37

def tickets_belong_to_organization
  errors.add(:tickets, "do not belong to this organization") unless tickets.all? { |ticket| order.organization.can? :manage, ticket }
end

#tickets_match_itemsObject



29
30
31
# File 'app/models/exchange.rb', line 29

def tickets_match_items
  errors.add(:tickets, "must match the items to exchange") unless tickets.length == items.length
end