rsr_group 1.0.0.pre → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rsr_group.rb +5 -0
- data/lib/rsr_group/base.rb +11 -24
- data/lib/rsr_group/constants.rb +89 -0
- data/lib/rsr_group/data_row.rb +78 -0
- data/lib/rsr_group/order.rb +63 -40
- data/lib/rsr_group/order_detail.rb +1 -1
- data/lib/rsr_group/order_ffl.rb +1 -1
- data/lib/rsr_group/order_recipient.rb +4 -28
- data/lib/rsr_group/response_file.rb +89 -0
- data/lib/rsr_group/version.rb +1 -1
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 30aec6e206ed332500ce1beac071246a0ae65ebc
|
4
|
+
data.tar.gz: ff5b079c4316ed16e702dc950bed30f2be80f23e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f4957378cc596059428bcb1d4f53f14565471cbab324b58418c49e1b460256ecce39555c118d33aefe9dcecc8cc0f4cee44ecfaef79a912f97b7fb34ecba161b
|
7
|
+
data.tar.gz: 103f0c0119ef13e4a22a6feadb55533fc9925467c194d646483850732e16bcab6ae5abba216a67e878295caa03cbded6a4c2e8ecbe7cb3689ddb553353e83473
|
data/lib/rsr_group.rb
CHANGED
@@ -5,12 +5,15 @@ require 'date'
|
|
5
5
|
require 'net/ftp'
|
6
6
|
|
7
7
|
require 'rsr_group/base'
|
8
|
+
require 'rsr_group/constants'
|
9
|
+
require 'rsr_group/data_row'
|
8
10
|
require 'rsr_group/department'
|
9
11
|
require 'rsr_group/inventory'
|
10
12
|
require 'rsr_group/order'
|
11
13
|
require 'rsr_group/order_detail'
|
12
14
|
require 'rsr_group/order_ffl'
|
13
15
|
require 'rsr_group/order_recipient'
|
16
|
+
require 'rsr_group/response_file'
|
14
17
|
require 'rsr_group/user'
|
15
18
|
|
16
19
|
module RsrGroup
|
@@ -32,11 +35,13 @@ module RsrGroup
|
|
32
35
|
class Configuration
|
33
36
|
attr_accessor :ftp_host
|
34
37
|
attr_accessor :submission_dir
|
38
|
+
attr_accessor :response_dir
|
35
39
|
attr_accessor :vendor_email
|
36
40
|
|
37
41
|
def initialize
|
38
42
|
@ftp_host ||= "ftp.rsrgroup.com"
|
39
43
|
@submission_dir ||= File.join("eo", "incoming")
|
44
|
+
@response_dir ||= File.join("eo", "outgoing")
|
40
45
|
@vendor_email ||= nil
|
41
46
|
end
|
42
47
|
end
|
data/lib/rsr_group/base.rb
CHANGED
@@ -1,24 +1,17 @@
|
|
1
1
|
module RsrGroup
|
2
2
|
class Base
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
SHIPPING_METHODS = {
|
7
|
-
"Grnd" => "Ground",
|
8
|
-
"1Day" => "Next Day Air",
|
9
|
-
"2Day" => "2nd Day Air",
|
10
|
-
"3Day" => "3 Day Select",
|
11
|
-
"NDam" => "Next Day Early AM",
|
12
|
-
"NDAS" => "Next Day Air Saver",
|
13
|
-
"PRIO" => "Priority"
|
14
|
-
}
|
15
|
-
|
16
|
-
protected
|
4
|
+
def self.connect(options = {})
|
5
|
+
requires!(options, :username, :password)
|
17
6
|
|
18
|
-
|
19
|
-
|
7
|
+
Net::FTP.open(RsrGroup.config.ftp_host, options[:username], options[:password]) do |ftp|
|
8
|
+
ftp.passive = true
|
9
|
+
yield ftp
|
10
|
+
end
|
20
11
|
end
|
21
12
|
|
13
|
+
protected
|
14
|
+
|
22
15
|
def self.requires!(hash, *params)
|
23
16
|
params.each do |param|
|
24
17
|
if param.is_a?(Array)
|
@@ -32,20 +25,14 @@ module RsrGroup
|
|
32
25
|
end
|
33
26
|
end
|
34
27
|
|
35
|
-
def ftp_host
|
36
|
-
self.class.ftp_host
|
37
|
-
end
|
38
|
-
|
39
28
|
# Wrapper to `self.requires!` that can be used as an instance method.
|
40
29
|
def requires!(*args)
|
41
30
|
self.class.requires!(*args)
|
42
31
|
end
|
43
32
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
Net::FTP.open(ftp_host, options[:username], options[:password]) do |ftp|
|
48
|
-
ftp.passive = true
|
33
|
+
# Instance methods become class methods through inheritance
|
34
|
+
def connect(options)
|
35
|
+
self.class.connect(options) do |ftp|
|
49
36
|
yield ftp
|
50
37
|
end
|
51
38
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module RsrGroup
|
2
|
+
|
3
|
+
FILE_TYPES = {
|
4
|
+
"EERR" => "Error",
|
5
|
+
"ECONF" => "Confirmation",
|
6
|
+
"ESHIP" => "Shipping",
|
7
|
+
}
|
8
|
+
|
9
|
+
LINE_TYPES = {
|
10
|
+
"00" => :file_header,
|
11
|
+
"10" => :order_header,
|
12
|
+
"11" => :ffl_dealer,
|
13
|
+
"20" => :order_detail,
|
14
|
+
"30" => :confirmation_header,
|
15
|
+
"40" => :confirmation_detail,
|
16
|
+
"50" => :confirmation_trailer,
|
17
|
+
"60" => :shipping_header,
|
18
|
+
"70" => :shipping_detail,
|
19
|
+
"80" => :shipping_trailer,
|
20
|
+
"90" => :order_trailer,
|
21
|
+
"99" => :file_trailer,
|
22
|
+
}
|
23
|
+
|
24
|
+
SHIPPING_CARRIERS = %w(UPS USPS)
|
25
|
+
|
26
|
+
SHIPPING_METHODS = {
|
27
|
+
"Grnd" => "Ground",
|
28
|
+
"1Day" => "Next Day Air",
|
29
|
+
"2Day" => "2nd Day Air",
|
30
|
+
"3Day" => "3 Day Select",
|
31
|
+
"NDam" => "Next Day Early AM",
|
32
|
+
"NDAS" => "Next Day Air Saver",
|
33
|
+
"PRIO" => "Priority"
|
34
|
+
}
|
35
|
+
|
36
|
+
ERROR_CODES = {
|
37
|
+
"00001" => "File Header record missing",
|
38
|
+
"00002" => "Invalid date",
|
39
|
+
"00003" => "Duplicate file",
|
40
|
+
"00004" => "Invalid Etailer number",
|
41
|
+
"00005" => "Empty file",
|
42
|
+
"00006" => "Invalid Sequence number",
|
43
|
+
"10001" => "Order Header record missing",
|
44
|
+
"10002" => "Invalid ship‐to name",
|
45
|
+
"10003" => "Missing ship‐to address",
|
46
|
+
"10004" => "Invalid ship‐to city",
|
47
|
+
"10005" => "Invalid ship‐to state",
|
48
|
+
"10006" => "Invalid ship‐to zip",
|
49
|
+
"10007" => "Invalid phone",
|
50
|
+
"10008" => "Invalid email option",
|
51
|
+
"10009" => "Invalid email address",
|
52
|
+
"10010" => "Duplicate order",
|
53
|
+
"10011" => "No orders found ",
|
54
|
+
"10012" => "Invalid ship‐to address ",
|
55
|
+
"10013" => "Invalid ship‐to county ",
|
56
|
+
"10014" => "Order Cancelled",
|
57
|
+
"10099" => "No quantity available",
|
58
|
+
"10999" => "Miscellaneous",
|
59
|
+
"11000" => "FFL Dealer record missing",
|
60
|
+
"11001" => "Account is not setup for firearm shipments",
|
61
|
+
"11002" => "Dealer FFL not found",
|
62
|
+
"11003" => "Dealer zip code mismatch",
|
63
|
+
"11004" => "Dealer name mismatch",
|
64
|
+
"11005" => "Dealer state mismatch",
|
65
|
+
"11006" => "Dealer FFL expired",
|
66
|
+
"11007" => "Firearms combined with accessories",
|
67
|
+
"11008" => "Dealer deactivated",
|
68
|
+
"11999" => "Miscellaneous",
|
69
|
+
"20001" => "Order Detail record missing",
|
70
|
+
"20002" => "Invalid RSR stock number",
|
71
|
+
"20003" => "Invalid quantity ordered",
|
72
|
+
"20004" => "Invalid shipping carrier",
|
73
|
+
"20005" => "Invalid shipping method",
|
74
|
+
"20006" => "Duplicate item in order",
|
75
|
+
"20007" => "Item out of stock",
|
76
|
+
"20008" => "Item prohibited",
|
77
|
+
"20009" => "Phone number required",
|
78
|
+
"20010" => "RSR allocated",
|
79
|
+
"20011" => "Case quantity required",
|
80
|
+
"20999" => "Miscellaneous",
|
81
|
+
"30001" => "OrderTrailerrecordmissing",
|
82
|
+
"30002" => "Invalid total order amount",
|
83
|
+
"30003" => "Mismatch on number of items ordered and number specified on order trailer record",
|
84
|
+
"99001" => "File Trailer record missing",
|
85
|
+
"99002" => "Invalid quantity ordered",
|
86
|
+
"99003" => "Mismatch on number of orders found and total quantity specified on file trailer record",
|
87
|
+
}
|
88
|
+
|
89
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module RsrGroup
|
2
|
+
class DataRow < Base
|
3
|
+
|
4
|
+
attr_reader :committed, :date_shipped, :error_code, :handling_fee,
|
5
|
+
:identifier, :licence_number, :line_type, :message, :name,
|
6
|
+
:ordered, :quantity, :stock_id, :ship_to_name, :shipped,
|
7
|
+
:shipping_carrier, :shipping_cost, :shipping_method,
|
8
|
+
:rsr_order_number, :tracking_number, :zip
|
9
|
+
|
10
|
+
def initialize(line, has_errors: false)
|
11
|
+
points = line.split(";").map { |point| point.chomp }
|
12
|
+
|
13
|
+
@identifier = points[0]
|
14
|
+
@line_type = LINE_TYPES[points[1]]
|
15
|
+
|
16
|
+
case @line_type
|
17
|
+
when :order_header
|
18
|
+
get_errors(points[-1]) if has_errors && points[-1] != "00000"
|
19
|
+
@ship_to_name = points[2]
|
20
|
+
@zip = points[8]
|
21
|
+
when :ffl_dealer # 11
|
22
|
+
get_errors(points[-1]) if has_errors && points[-1] != "00000"
|
23
|
+
@licence_number = points[2]
|
24
|
+
@name = points[3]
|
25
|
+
@zip = points[4]
|
26
|
+
when :order_detail # 20
|
27
|
+
get_errors(points[-1]) if has_errors && points[-1] != "00000"
|
28
|
+
@quantity = points[3].to_i
|
29
|
+
@stock_id = points[2]
|
30
|
+
@shipping_carrier = points[4]
|
31
|
+
@shipping_method = SHIPPING_METHODS[points[5]]
|
32
|
+
when :confirmation_header # 30
|
33
|
+
@rsr_order_number = points[2]
|
34
|
+
when :confirmation_detail # 40
|
35
|
+
@committed = points[4].to_i
|
36
|
+
@ordered = points[3].to_i
|
37
|
+
@stock_id = points[2]
|
38
|
+
when :confirmation_trailer # 50
|
39
|
+
@committed = points[3].to_i
|
40
|
+
@ordered = points[2].to_i
|
41
|
+
when :shipping_header # 60
|
42
|
+
@date_shipped = Time.parse(points[5])
|
43
|
+
@handling_fee = points[7].to_i.to_s
|
44
|
+
@rsr_order_number = points[4]
|
45
|
+
@ship_to_name = points[2]
|
46
|
+
@shipping_carrier = points[8]
|
47
|
+
@shipping_cost = points[6].to_i.to_s
|
48
|
+
@shipping_method = points[9]
|
49
|
+
@tracking_number = points[3]
|
50
|
+
when :shipping_detail # 70
|
51
|
+
@ordered = points[3].to_i
|
52
|
+
@shipped = points[4].to_i
|
53
|
+
@stock_id = points[2]
|
54
|
+
when :shipping_trailer # 80
|
55
|
+
@ordered = points[2].to_i
|
56
|
+
@shipped = points[3].to_i
|
57
|
+
when :order_trailer # 90
|
58
|
+
@quantity = points[2].to_i
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def to_h
|
63
|
+
@to_h ||= Hash[
|
64
|
+
instance_variables.map do |name|
|
65
|
+
[name.to_s.gsub("@", "").to_sym, instance_variable_get(name)]
|
66
|
+
end
|
67
|
+
]
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def get_errors(code)
|
73
|
+
@error_code = code
|
74
|
+
@message = ERROR_CODES[code]
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
data/lib/rsr_group/order.rb
CHANGED
@@ -1,60 +1,76 @@
|
|
1
1
|
module RsrGroup
|
2
|
+
# To submit an order:
|
3
|
+
#
|
4
|
+
# * Instantiate a new Order, passing in `:merchant_number`, `:username`, `:password`, `:sequence_number`, and `:identifier`
|
5
|
+
# * Call {#add_recipient}
|
6
|
+
# * Call {#add_item} for each item on the order
|
7
|
+
# * Call {#submit!} to send the order
|
2
8
|
class Order < Base
|
3
9
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
LINE_TYPES = {
|
11
|
-
"00" => "file_header",
|
12
|
-
"10" => "order_header",
|
13
|
-
"11" => "ffl_dealer",
|
14
|
-
"20" => "order_detail",
|
15
|
-
"90" => "order_trailer",
|
16
|
-
"99" => "file_trailer"
|
17
|
-
}
|
18
|
-
|
10
|
+
# @param [Hash] options
|
11
|
+
# @option options [String] :merchant_number *required*
|
12
|
+
# @option options [Integer] :sequence_number *required*
|
13
|
+
# @option options [String] :username *required*
|
14
|
+
# @option options [String] :password *required*
|
15
|
+
# @option options [String] :identifier *required*
|
19
16
|
def initialize(options = {})
|
20
|
-
requires!(options, :sequence_number, :username, :password, :identifier)
|
17
|
+
requires!(options, :merchant_number, :sequence_number, :username, :password, :identifier)
|
21
18
|
|
22
19
|
@credentials = options.select { |k, v| [:username, :password].include?(k) }
|
23
20
|
@identifier = options[:identifier]
|
21
|
+
@merchant_number = options[:merchant_number]
|
24
22
|
@sequence_number = "%04d" % options[:sequence_number] # Leading zeros are required
|
25
|
-
@timestamp = Time.now.strftime("%Y%m%
|
26
|
-
@
|
23
|
+
@timestamp = Time.now.strftime("%Y%m%d")
|
24
|
+
@items = []
|
27
25
|
end
|
28
26
|
|
29
|
-
|
30
|
-
|
27
|
+
# @param [Hash] shipping_info
|
28
|
+
# @option shipping_info [String] :shipping_name *required*
|
29
|
+
# @option shipping_info [String] :attn
|
30
|
+
# @option shipping_info [String] :address_one *required*
|
31
|
+
# @option shipping_info [String] :address_two
|
32
|
+
# @option shipping_info [String] :city *required*
|
33
|
+
# @option shipping_info [String] :state *required*
|
34
|
+
# @option shipping_info [String] :zip *required*
|
35
|
+
# @option shipping_info [String] :phone
|
36
|
+
# @option shipping_info [String] :email
|
37
|
+
#
|
38
|
+
# @param [Hash] ffl_options optional
|
39
|
+
# @option ffl_options [String] :licence_number *required*
|
40
|
+
# @option ffl_options [String] :name *required*
|
41
|
+
# @option ffl_options [String] :zip *required*
|
42
|
+
def add_recipient(shipping_info, ffl_options = {})
|
43
|
+
@recipient = OrderRecipient.new(shipping_info.merge(order_identifier: @identifier))
|
44
|
+
@ffl = OrderFFL.new(ffl_options.merge(order_identifier: @identifier)) if ffl_options.any?
|
31
45
|
end
|
32
46
|
|
33
|
-
|
34
|
-
|
47
|
+
# @param [Hash] item
|
48
|
+
# @option item [String] :rsr_stock_number *required*
|
49
|
+
# @option item [Integer] :quantity *required*
|
50
|
+
# @option item [String] :shipping_carrier *required*
|
51
|
+
# @option item [String] :shipping_method *required*
|
52
|
+
def add_item(item)
|
53
|
+
@items << OrderDetail.new(item.merge(order_identifier: @identifier))
|
35
54
|
end
|
36
55
|
|
37
56
|
def filename
|
38
|
-
name = ["EORD",
|
57
|
+
name = ["EORD", @merchant_number, @timestamp, @sequence_number].join("-")
|
39
58
|
[name, ".txt"].join
|
40
59
|
end
|
41
60
|
|
42
|
-
def recipients
|
43
|
-
@recipients ||= []
|
44
|
-
end
|
45
|
-
|
46
61
|
def to_txt
|
62
|
+
raise "Recipient is required!" unless @recipient
|
63
|
+
raise "Items are required!" unless @items.length > 0
|
64
|
+
|
47
65
|
txt = header + "\n"
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
txt += (recipient.ffl.to_single_line + "\n")
|
52
|
-
end
|
53
|
-
recipient.items.each do |item|
|
54
|
-
txt += (item.to_single_line + "\n")
|
55
|
-
end
|
56
|
-
txt += recipient.trailer + "\n"
|
66
|
+
txt += @recipient.to_single_line + "\n"
|
67
|
+
if @ffl
|
68
|
+
txt += (@ffl.to_single_line + "\n")
|
57
69
|
end
|
70
|
+
@items.each do |item|
|
71
|
+
txt += (item.to_single_line + "\n")
|
72
|
+
end
|
73
|
+
txt += order_trailer + "\n"
|
58
74
|
txt += footer
|
59
75
|
end
|
60
76
|
|
@@ -68,16 +84,23 @@ module RsrGroup
|
|
68
84
|
io.close
|
69
85
|
end
|
70
86
|
end
|
87
|
+
true
|
71
88
|
end
|
72
89
|
|
73
90
|
private
|
74
91
|
|
75
|
-
def
|
76
|
-
|
92
|
+
def header
|
93
|
+
["FILEHEADER", LINE_TYPES.key(:file_header), @merchant_number, @timestamp, @sequence_number].join(";")
|
94
|
+
end
|
95
|
+
|
96
|
+
def footer
|
97
|
+
# NOTE: The 'Number of Orders in File' datum is hard-coded to 1
|
98
|
+
# For our purposes, only 1 recipient can ever be allowed in an RSR order
|
99
|
+
["FILETRAILER", LINE_TYPES.key(:file_trailer), '00001'].join(";")
|
77
100
|
end
|
78
101
|
|
79
|
-
def
|
80
|
-
|
102
|
+
def order_trailer
|
103
|
+
[@identifier, LINE_TYPES.key(:order_trailer), ("%07d" % @items.length)].join(";")
|
81
104
|
end
|
82
105
|
|
83
106
|
end
|
data/lib/rsr_group/order_ffl.rb
CHANGED
@@ -1,27 +1,17 @@
|
|
1
1
|
module RsrGroup
|
2
2
|
class OrderRecipient < Base
|
3
3
|
|
4
|
-
attr_reader :order_identifier
|
5
|
-
attr_accessor :ffl
|
6
|
-
attr_accessor :items
|
7
|
-
|
8
4
|
def initialize(options = {})
|
9
5
|
requires!(options, :order_identifier, :shipping_name, :address_one, :city, :state, :zip)
|
10
6
|
|
11
|
-
@ffl = options[:ffl]
|
12
|
-
@items = options[:items] || []
|
13
7
|
@options = options
|
14
8
|
@order_identifier = options[:order_identifier]
|
15
9
|
end
|
16
10
|
|
17
|
-
def items
|
18
|
-
@items ||= []
|
19
|
-
end
|
20
|
-
|
21
11
|
def to_single_line
|
22
12
|
[
|
23
|
-
order_identifier,
|
24
|
-
|
13
|
+
@order_identifier,
|
14
|
+
LINE_TYPES.key(:order_header),
|
25
15
|
@options[:shipping_name],
|
26
16
|
@options[:attn],
|
27
17
|
@options[:address_one],
|
@@ -29,27 +19,13 @@ module RsrGroup
|
|
29
19
|
@options[:city],
|
30
20
|
@options[:state],
|
31
21
|
@options[:zip],
|
32
|
-
@options[:phone],
|
33
|
-
(@options[:email].nil? ?
|
22
|
+
(@options[:phone].nil? ? '' : @options[:phone].gsub(/\D/, '')),
|
23
|
+
(@options[:email].nil? ? 'N' : 'Y'),
|
34
24
|
@options[:email],
|
35
25
|
RsrGroup.config.vendor_email,
|
36
26
|
nil
|
37
27
|
].join(";")
|
38
28
|
end
|
39
29
|
|
40
|
-
def trailer
|
41
|
-
[
|
42
|
-
order_identifier,
|
43
|
-
Order::LINE_TYPES.key("order_trailer"),
|
44
|
-
("%07d" % quantity_sum)
|
45
|
-
].join(";")
|
46
|
-
end
|
47
|
-
|
48
|
-
private
|
49
|
-
|
50
|
-
def quantity_sum
|
51
|
-
items.map(&:quantity).map(&:to_i).inject(:+)
|
52
|
-
end
|
53
|
-
|
54
30
|
end
|
55
31
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module RsrGroup
|
2
|
+
class ResponseFile < Base
|
3
|
+
|
4
|
+
attr_reader :filename
|
5
|
+
|
6
|
+
def initialize(options = {})
|
7
|
+
requires!(options, :username, :password, :filename)
|
8
|
+
|
9
|
+
@credentials = options.select { |k, v| [:username, :password].include?(k) }
|
10
|
+
@filename = options[:filename]
|
11
|
+
end
|
12
|
+
|
13
|
+
FILE_TYPES.each do |key, value|
|
14
|
+
define_method("#{value.downcase}?".to_sym) do
|
15
|
+
response_type == value
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.all(options = {})
|
20
|
+
requires!(options, :username, :password)
|
21
|
+
|
22
|
+
Base.connect(options) do |ftp|
|
23
|
+
ftp.chdir(RsrGroup.config.response_dir)
|
24
|
+
ftp.nlst("*.txt")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def content
|
29
|
+
return @content if @content
|
30
|
+
connect(@credentials) do |ftp|
|
31
|
+
ftp.chdir(RsrGroup.config.response_dir)
|
32
|
+
@content = ftp.gettextfile(@filename, nil)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
alias get_content content
|
36
|
+
|
37
|
+
def response_type
|
38
|
+
FILE_TYPES[@filename.split("-").first]
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_json
|
42
|
+
get_content
|
43
|
+
|
44
|
+
@json = {
|
45
|
+
response_type: response_type,
|
46
|
+
identifier: @content.lines[1].split(";")[0]
|
47
|
+
}
|
48
|
+
|
49
|
+
return parse_eerr if error?
|
50
|
+
return parse_econf if confirmation?
|
51
|
+
return parse_eship if shipping?
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def parse_eerr
|
57
|
+
errors = @content.lines[1..-2].map do |line|
|
58
|
+
DataRow.new(line, has_errors: true).to_h
|
59
|
+
end.compact
|
60
|
+
|
61
|
+
errors.select! { |e| !e[:error_code].nil? }
|
62
|
+
|
63
|
+
@json.merge!(errors: errors)
|
64
|
+
end
|
65
|
+
|
66
|
+
def parse_econf
|
67
|
+
details = @content.lines[2..-3].map do |line|
|
68
|
+
DataRow.new(line).to_h
|
69
|
+
end.compact
|
70
|
+
|
71
|
+
@json.merge!({
|
72
|
+
rsr_order_number: @content.lines[1].split(";")[2].chomp,
|
73
|
+
details: details
|
74
|
+
})
|
75
|
+
end
|
76
|
+
|
77
|
+
def parse_eship
|
78
|
+
details = @content.lines[1..-3].map do |line|
|
79
|
+
DataRow.new(line).to_h
|
80
|
+
end.compact
|
81
|
+
|
82
|
+
@json.merge!({
|
83
|
+
rsr_order_number: @content.lines[0].split(";")[3].chomp,
|
84
|
+
details: details
|
85
|
+
})
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
end
|
data/lib/rsr_group/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rsr_group
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dale Campbell
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -87,12 +87,15 @@ files:
|
|
87
87
|
- config.rb.example
|
88
88
|
- lib/rsr_group.rb
|
89
89
|
- lib/rsr_group/base.rb
|
90
|
+
- lib/rsr_group/constants.rb
|
91
|
+
- lib/rsr_group/data_row.rb
|
90
92
|
- lib/rsr_group/department.rb
|
91
93
|
- lib/rsr_group/inventory.rb
|
92
94
|
- lib/rsr_group/order.rb
|
93
95
|
- lib/rsr_group/order_detail.rb
|
94
96
|
- lib/rsr_group/order_ffl.rb
|
95
97
|
- lib/rsr_group/order_recipient.rb
|
98
|
+
- lib/rsr_group/response_file.rb
|
96
99
|
- lib/rsr_group/user.rb
|
97
100
|
- lib/rsr_group/version.rb
|
98
101
|
- rsr_group.gemspec
|
@@ -111,9 +114,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
111
114
|
version: '2.0'
|
112
115
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
116
|
requirements:
|
114
|
-
- - "
|
117
|
+
- - ">="
|
115
118
|
- !ruby/object:Gem::Version
|
116
|
-
version:
|
119
|
+
version: '0'
|
117
120
|
requirements: []
|
118
121
|
rubyforge_project:
|
119
122
|
rubygems_version: 2.6.7
|