Sha256: 664133966f6a74f7bd8647c5de010946a89341d216f35be9c4fd30fd7322d539

Contents?: true

Size: 1.72 KB

Versions: 1

Compression:

Stored size: 1.72 KB

Contents

require 'money'
require 'active_support'

module TicketingHub
  class Order < Resource
    schema do
      integer :id, :venue_id, :consumer_id
      float :commission, :total, default: 0
      string :currency
      datetime :confirmed_at
    end

    attr_accessor :consumer_fields

    has_many :tickets

    belongs_to :venue
    belongs_to :consumer

    def total
      attributes[:total].to_money currency
    end

    def commission
      attributes[:commission].to_money currency
    end

    def consumer_fields
      @consumer_fields ||= client.get("venues/#{venue_id}/orders/new")['consumer_fields'].map do |field|
        HashWithIndifferentAccess.new field
      end
    end

    def tickets=(tickets)
      @tickets = tickets.map { |ticket| Ticket.new ticket, client }
    end

    def consumer_fields=(fields)
      @consumer_fields = fields
      self.consumer = Consumer.from_fields consumer_fields
    end

    def pdf
      client.get("orders/#{id}", accept: 'application/pdf')
    end

    def create attributes={}
      self.attributes = attributes
      if tiers = attributes.delete(:tiers)
        tickets = attributes[:tickets_attributes] ||= []
        tiers.each do |tier_id, qty|
          qty.to_i.times { tickets.push tier_id: tier_id.to_i }
        end
      end

      if (consumer = attributes.delete(:consumer)).try :persisted?
        (attributes[:consumer_attributes] ||= {})[:email] = consumer.email
      end

      venue.orders.build client.post("venues/#{venue_id}/orders", attributes)
    rescue TicketingHub::BadRequest => error
      self.tap { errors.add :tickets, error.response_body['message'] }
    rescue TicketingHub::UnprocessableEntity => error
      venue.orders.build error.response_body
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ticketinghub-0.0.2 lib/ticketing_hub/order.rb