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

Defined Under Namespace

Classes: ResponseStruct

Constant Summary

Constants inherited from Base

Base::DEFAULT_CATALOG_FILENAME, Base::DEFAULT_DIR, Base::KEYDEALER_CATALOG_FILENAME, Base::KEYDEALER_DIR, Base::MAP_FILENAME, Base::QTY_FILENAME

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



27
28
29
30
31
32
33
34
35
36
# 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

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



68
69
70
71
72
# 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 = {}) ⇒ 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):

  • :license_number (String)

    required

  • :name (String)

    required

  • :zip (String)

    required



53
54
55
56
57
58
59
60
61
# 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

#filenameObject



74
75
76
77
# File 'lib/rsr_group/order.rb', line 74

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

#submit!Object



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# 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_txtObject



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# 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