class RsrGroup::Order

To submit an order:

Public Class Methods

new(options = {}) click to toggle source

@param [Hash] options @option options [String] :merchant_number required @option options [Integer] :sequence_number required @option options [String] :username required @option options [String] :password required @option options [String] :identifier required

# File lib/rsr_group/order.rb, line 27
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 = "%05d" % options[:merchant_number] # Leading zeros are required
  @sequence_number = "%04d" % options[:sequence_number] # Leading zeros are required
  @timestamp       = Time.now.strftime("%Y%m%d")
  @items           = []
end

Public Instance Methods

add_item(item = {}) click to toggle source

@param [Hash] item @option item [String] :rsr_stock_number required @option item [Integer] :quantity required @option item [String] :shipping_carrier required @option item [String] :shipping_method required

# File lib/rsr_group/order.rb, line 68
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 = {}) click to toggle source

@param [Hash] shipping_info @option shipping_info [String] :shipping_name required @option shipping_info [String] :attn @option shipping_info [String] :address_one required @option shipping_info [String] :address_two @option shipping_info [String] :city required @option shipping_info [String] :state required @option shipping_info [String] :zip required @option shipping_info [String] :phone @option shipping_info [String] :email

@param [Hash] ffl_options optional @option ffl_options [String] :license_number required @option ffl_options [String] :name required @option ffl_options [String] :zip required

# File lib/rsr_group/order.rb, line 53
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
filename() click to toggle source
# File lib/rsr_group/order.rb, line 74
def filename
  name = ["EORD", @merchant_number, @timestamp, @sequence_number].join("-")
  [name, ".txt"].join
end
submit!() click to toggle source
# File lib/rsr_group/order.rb, line 95
def submit!
  connect(@credentials) do |ftp|
    ftp.chdir(RsrGroup.config.submission_dir)
    io = StringIO.new(to_txt)
    begin
      ftp.storlines("STOR " + filename, io)
      success = ftp.nlst.include?(filename)
      @response = ResponseStruct.new(success, nil, modified: ftp.mtime(filename), size: ftp.size(filename))
    ensure
      io.close
    end
    ftp.close
  end
  @response || ResponseStruct.new(false)
rescue Net::FTPPermError => e
  return ResponseStruct.new(false, e.message.chomp)
end
to_txt() click to toggle source
# File lib/rsr_group/order.rb, line 79
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

Private Instance Methods

header() click to toggle source
# File lib/rsr_group/order.rb, line 115
def header
  ["FILEHEADER", LINE_TYPES.key(:file_header), @merchant_number, @timestamp, @sequence_number].join(";")
end
order_trailer() click to toggle source
# File lib/rsr_group/order.rb, line 125
def order_trailer
  [@identifier, LINE_TYPES.key(:order_trailer), ("%07d" % total_quantity)].join(";")
end
total_quantity() click to toggle source
# File lib/rsr_group/order.rb, line 129
def total_quantity
  @items.map { |x| x.quantity.to_i }.inject(0, :+)
end