class RsrGroup::Order
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
Public Class Methods
@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
@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
@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
# File lib/rsr_group/order.rb, line 74 def filename name = ["EORD", @merchant_number, @timestamp, @sequence_number].join("-") [name, ".txt"].join end
# 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
# 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
# File lib/rsr_group/order.rb, line 115 def header ["FILEHEADER", LINE_TYPES.key(:file_header), @merchant_number, @timestamp, @sequence_number].join(";") end
# File lib/rsr_group/order.rb, line 125 def order_trailer [@identifier, LINE_TYPES.key(:order_trailer), ("%07d" % total_quantity)].join(";") end
# File lib/rsr_group/order.rb, line 129 def total_quantity @items.map { |x| x.quantity.to_i }.inject(0, :+) end