Class: BillHicks::Order

Inherits:
Base
  • Object
show all
Defined in:
lib/bill_hicks/order.rb

Overview

To submit an order:

  • Instantiate a new Order, passing in ‘:username` and `:password`

  • Call #add_header

  • Call #add_item for each item on the order

  • Call #submit! to send the order

See each method for a list of required options.

Instance Method Summary collapse

Methods inherited from Base

connect

Constructor Details

#initialize(options = {}) ⇒ Order

Returns a new instance of Order.

Parameters:

  • options (Hash) (defaults to: {})

    a customizable set of options

Options Hash (options):

  • :username (String)

    required

  • :password (String)

    required



14
15
16
17
18
# File 'lib/bill_hicks/order.rb', line 14

def initialize(options = {})
  requires!(options, :username, :password)
  @options = options
  @items = []
end

Instance Method Details

#add_header(header = {}) ⇒ Object

Parameters:

  • header (Hash) (defaults to: {})
    • :customer [String] required

    • :purchase_order [String] required

    • :ffl [String] required

    • :shipping [Hash] required

      • :name [String] required

      • :address_1 [String] required

      • :address_2 [String] optional

      • :city [String] required

      • :state [String] required

      • :zip [String] required



31
32
33
34
35
36
37
38
39
# File 'lib/bill_hicks/order.rb', line 31

def add_header(header = {})
  requires!(header, :customer, :purchase_order, :ffl, :shipping)
  requires!(header[:shipping], :name, :address_1, :city, :state, :zip)
  @header = header
  # Ensure that address_2 is not an empty string
  if @header[:shipping][:address_2] && @header[:shipping][:address_2].empty?
    @header[:shipping][:address_2] = nil
  end
end

#add_item(item = {}) ⇒ Object

Parameters:

  • item (Hash) (defaults to: {})

    a customizable set of options

Options Hash (item):

  • :item_number (String)

    required

  • :quantity (Integer)

    required

  • :price (String)

    required - Decimal formatted price, without currency sign

  • :description (String)

    optional



45
46
47
48
# File 'lib/bill_hicks/order.rb', line 45

def add_item(item = {})
  requires!(item, :item_number, :quantity, :price)
  @items << item
end

#filenameObject



50
51
52
# File 'lib/bill_hicks/order.rb', line 50

def filename
  "#{@header[:purchase_order]}-order.txt"
end

#submit!Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/bill_hicks/order.rb', line 54

def submit!
  raise BillHicks::InvalidOrder.new("Must call #add_header before submitting") if @header.nil?
  raise BillHicks::InvalidOrder.new("Must add items with #add_item before submitting") if @items.empty?

  @order_file = Tempfile.new(filename)
  begin
    CSV.open(@order_file.path, 'w+', col_sep: "\t") do |csv|
      csv << header_names
      csv << header_fields
      csv << items_header
      @items.each do |item|
        csv << item_fields(item)
      end
    end

    upload!
  ensure
    # Close and delete (unlink) file.
    @order_file.close
    @order_file.unlink
  end

  # TODO: Find some way of returning a meaningful true/false. Currently, if there's a problem, an exception is raised.
  true
end