Sha256: 4497e3e0ab664d8feabcc4400cefe49d5172e78da23f86a9777582de9d97cc9e

Contents?: true

Size: 1.92 KB

Versions: 2

Compression:

Stored size: 1.92 KB

Contents

class Exchange
  include ActiveModel::Validations

  attr_accessor :order, :items, :tickets

  validates_presence_of :order
  validates_length_of :items,   :minimum => 1
  validates_length_of :tickets, :minimum => 1
  validate :items_are_exchangeable
  validate :tickets_match_items
  validate :tickets_are_available
  validate :tickets_belong_to_organization

  def initialize(order, items, tickets = [])
    self.order =        order
    self.items =        items
    self.tickets =      tickets
  end

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

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

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

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

  def submit
    return_items
    sell_new_items
  end

  def return_items
    items.map(&:return!)
  end

  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

  def create_order(time=Time.now)
    ::Rails.logger.debug("CREATING EXCHANGE ORDER")
    exchange_order = ApplicationOrder.new.tap do |exchange_order|
      exchange_order.person = order.person
      exchange_order.parent = order
      exchange_order.created_at = time
      exchange_order.for_organization order.organization
      exchange_order << tickets
    end
    ::Rails.logger.debug("RECORDING EXCHANGE")
    exchange_order.record_exchange!
    ::Rails.logger.debug("SAVING ORDER")
    exchange_order.save!
    
    ::Rails.logger.debug("ORDER SAV'D: " + exchange_order.to_s)
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
artfully_ose-1.0.0.rc4 app/models/exchange.rb
artfully_ose-1.0.0.rc3 app/models/exchange.rb