Class: RsrGroup::Order

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

Overview

To submit an order:

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

  • Call #add_recipient

  • Call #add_item for each item on the order

  • Call #submit! to send the order

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: {})

Options Hash (options):

  • :merchant_number (String)

    required

  • :sequence_number (Integer)

    required

  • :username (String)

    required

  • :password (String)

    required

  • :identifier (String)

    required



16
17
18
19
20
21
22
23
24
25
# File 'lib/rsr_group/order.rb', line 16

def initialize(options = {})
  requires!(options, :merchant_number, :sequence_number, :username, :password, :identifier)

  @credentials     = options.select { |k, v| [:username, :password].include?(k) }
  @identifier      = options[:identifier]
  @merchant_number = options[:merchant_number]
  @sequence_number = "%04d" % options[:sequence_number] # Leading zeros are required
  @timestamp       = Time.now.strftime("%Y%m%d")
  @items           = []
end

Instance Method Details

#add_item(item = {}) ⇒ Object

Parameters:

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

Options Hash (item):

  • :rsr_stock_number (String)

    required

  • :quantity (Integer)

    required

  • :shipping_carrier (String)

    required

  • :shipping_method (String)

    required



57
58
59
60
61
# File 'lib/rsr_group/order.rb', line 57

def add_item(item = {})
  requires!(item, :rsr_stock_number, :quantity, :shipping_carrier, :shipping_method)

  @items << OrderDetail.new(item.merge(order_identifier: @identifier))
end

#add_recipient(shipping_info, ffl_options = {}) ⇒ Object

Parameters:

  • shipping_info (Hash)
  • ffl_options (Hash) (defaults to: {})

    optional

Options Hash (shipping_info):

  • :shipping_name (String)

    required

  • :attn (String)
  • :address_one (String)

    required

  • :address_two (String)
  • :city (String)

    required

  • :state (String)

    required

  • :zip (String)

    required

  • :phone (String)
  • :email (String)

Options Hash (ffl_options):

  • :licence_number (String)

    required

  • :name (String)

    required

  • :zip (String)

    required



42
43
44
45
46
47
48
49
50
# File 'lib/rsr_group/order.rb', line 42

def add_recipient(shipping_info, ffl_options = {})
  requires!(shipping_info, :shipping_name, :address_one, :city, :state, :zip)

  @recipient = OrderRecipient.new(shipping_info.merge(order_identifier: @identifier))

  if ffl_options && ffl_options.any?
    @ffl = OrderFFL.new(ffl_options.merge(order_identifier: @identifier))
  end
end

#filenameObject



63
64
65
66
# File 'lib/rsr_group/order.rb', line 63

def filename
  name = ["EORD", @merchant_number, @timestamp, @sequence_number].join("-")
  [name, ".txt"].join
end

#submit!Object



84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/rsr_group/order.rb', line 84

def submit!
  connect(@credentials) do |ftp|
    ftp.chdir(RsrGroup.config.submission_dir)
    io = StringIO.new(to_txt)
    begin
      ftp.storlines("STOR " + filename, io)
    ensure
      io.close
    end
  end
  true
end

#to_txtObject



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/rsr_group/order.rb', line 68

def to_txt
  raise "Recipient is required!" unless @recipient
  raise "Items are required!" unless @items.length > 0

  txt = header + "\n"
  txt += @recipient.to_single_line + "\n"
  if @ffl
    txt += (@ffl.to_single_line + "\n")
  end
  @items.each do |item|
    txt += (item.to_single_line + "\n")
  end
  txt += order_trailer + "\n"
  txt += footer
end