rlm_logistics 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f5a67a7870bd38c90670cf546646b4e348bf813d
4
+ data.tar.gz: 76765a52d263223a6637734721a821d13439c9e4
5
+ SHA512:
6
+ metadata.gz: e0f9025e8cde7e98866518a1ea602a038d06c2229e9a879559a88dbd01e2dc23903170ba6b275503b7c7290d8a70b39991e954704d9a78972b4a27c33fc8d3a1
7
+ data.tar.gz: b317b9e3ef5b1858ee41afa76c7956b280424d9f8da2243aff3faf6fb2bbcbe89ef60851e64bd06d1921ba3419d661235e5a88e1b2312c2cf259f765073f0dfd
@@ -0,0 +1,10 @@
1
+ *.DS_Store
2
+ /.bundle/
3
+ /.yardoc
4
+ /Gemfile.lock
5
+ /_yardoc/
6
+ /coverage/
7
+ /doc/
8
+ /pkg/
9
+ /spec/reports/
10
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1 @@
1
+ 2.0.0-p576
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ before_install: gem install bundler -v 1.10.6
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
@@ -0,0 +1,158 @@
1
+ # RLM Logistics
2
+
3
+ This is a Ruby library for interfacing with the [RLM](http://www2.ronlynn.com/) API.
4
+
5
+ ### Usage
6
+
7
+ `config/inializer/rlm.rb`
8
+
9
+ ```ruby
10
+ RlmLogistics.config do |r|
11
+ r.username = "XXUSER"
12
+ r.password = "XXKEY"
13
+ r.endpoint_path = "TESTServices"
14
+ r.company = 90
15
+ end
16
+ ```
17
+
18
+ **inventory**
19
+
20
+ [RLM documentation](http://sellect-dev.s3.amazonaws.com/documentation/rlm/RLM-inventory-retrieval.pdf)
21
+
22
+ ```ruby
23
+ inventories = RlmLogistics::Record::Inventory.where(
24
+ retrieve_upcs: 'Y',
25
+ division_number: 10,
26
+ ats_includes_wip: 'N'
27
+ )
28
+ # =>
29
+ # [
30
+ # <RlmLogistics::Record::Inventory...>,
31
+ # <RlmLogistics::Record::Inventory...>,
32
+ # <RlmLogistics::Record::Inventory...>
33
+ # ]
34
+ ```
35
+
36
+ **sales order**
37
+
38
+ [RLM documentation](http://sellect-dev.s3.amazonaws.com/documentation/rlm/RLM-sales_order-entry.pdf)
39
+
40
+ ```ruby
41
+ shipping_address = {
42
+ name: "My Name",
43
+ address1: "ad1",
44
+ address2: "ad2",
45
+ city: "My city",
46
+ state: "NY",
47
+ zip: "My zip",
48
+ country_code: "USA",
49
+ address_type: "S"
50
+ }
51
+
52
+ billing_address = {
53
+ name: "My Name",
54
+ address1: "ad10",
55
+ city: "My city",
56
+ state: "NY",
57
+ zip: "My zip",
58
+ address_type: "B"
59
+ }
60
+
61
+ line_items = [
62
+ {
63
+ sku_number: 4,
64
+ style: "CB11D10",
65
+ color: "BLUE",
66
+ size: "S",
67
+ price: 10.99,
68
+ quantity: 1
69
+ }
70
+ ]
71
+
72
+ sales_order = RlmLogistics::Record::SalesOrder.new(
73
+ division_number: 50,
74
+ email: "customer@gmail.com",
75
+ currency: "$",
76
+ order_date: 20120115,
77
+ start_date: 20120115,
78
+ cancel_date: 20120115,
79
+ customer_po: "YOURPO#",
80
+ special01: 101,
81
+ special02: 102,
82
+ special03: 103,
83
+ special04: 104,
84
+ discount: 0.05,
85
+ warehouse: 1,
86
+ addresses: [
87
+ shipping_address,
88
+ billing_address
89
+ ],
90
+ details: line_items
91
+ )
92
+
93
+ sales_order.save
94
+ ```
95
+
96
+ If order submitted(saved) successfully the `sales_order` will have an `id` that relates to RLM's order id.
97
+
98
+ **credits**
99
+
100
+ [RLM documentation](http://sellect-dev.s3.amazonaws.com/documentation/rlm/RLM-credits.pdf)
101
+
102
+ ```ruby
103
+ credit = RlmLogistics::Record::Credit.new(
104
+ date_from: 20130131,
105
+ date_to: 20130601
106
+ )
107
+
108
+ credit.save
109
+ credit.parsed_data
110
+ # =>
111
+ # [
112
+ # <RlmLogistics::Record::Credit...>,
113
+ # <RlmLogistics::Record::Credit...>,
114
+ # <RlmLogistics::Record::Credit...>
115
+ # ]
116
+ ```
117
+
118
+ **items**
119
+
120
+ [RLM documentation](http://sellect-dev.s3.amazonaws.com/documentation/rlm/RLM-items.pdf)
121
+
122
+ ```ruby
123
+ items = RlmLogistics::Record::Item.where(
124
+ division_number: 10,
125
+ retrieve_upcs: "Y"
126
+ )
127
+ # =>
128
+ # [
129
+ # <RlmLogistics::Record::Item...>,
130
+ # <RlmLogistics::Record::Item...>,
131
+ # <RlmLogistics::Record::Item...>
132
+ # ]
133
+ ```
134
+
135
+ **packed orders**
136
+
137
+ [RLM documentation](http://sellect-dev.s3.amazonaws.com/documentation/rlm/RLM-packed_order.pdf)
138
+
139
+ ```ruby
140
+ packed_order = RlmLogistics::Record::PackedOrder.all
141
+ # =>
142
+ # [
143
+ # <RlmLogistics::Record::PackedOrder...>,
144
+ # <RlmLogistics::Record::PackedOrder...>,
145
+ # <RlmLogistics::Record::PackedOrder...>
146
+ # ]
147
+ ```
148
+
149
+ **error handling**
150
+
151
+ Validation and errors are handled by ActiveModel so error handling looks like this:
152
+
153
+ ```ruby
154
+ inventory.errors.full_messages
155
+ # => ["The user/key combination does not exist"]
156
+ inventory.valid?
157
+ # => false
158
+ ```
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "rlm_logistics"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,27 @@
1
+ require 'active_support'
2
+ require 'active_record/remote'
3
+ require 'rlm_logistics/client'
4
+ require 'rlm_logistics/response'
5
+
6
+ module RlmLogistics
7
+
8
+ module Record
9
+ autoload :Base, 'rlm_logistics/record/base'
10
+ autoload :Address, 'rlm_logistics/record/address'
11
+ autoload :Credit, 'rlm_logistics/record/credit'
12
+ autoload :Inventory, 'rlm_logistics/record/inventory'
13
+ autoload :Item, 'rlm_logistics/record/item'
14
+ autoload :Line, 'rlm_logistics/record/line'
15
+ autoload :PackedOrder, 'rlm_logistics/record/packed_order'
16
+ autoload :SalesOrder, 'rlm_logistics/record/sales_order'
17
+ end
18
+
19
+ mattr_accessor :username, :password, :endpoint_path, :company
20
+
21
+ extend self
22
+
23
+ def config
24
+ yield self
25
+ end
26
+
27
+ end
@@ -0,0 +1,17 @@
1
+ module RlmLogistics
2
+ class Client < ActiveRecord::Remote::Client
3
+
4
+ secure false
5
+ content_type "text/xml; charset=utf-8"
6
+ host "www.ronlynn.com"
7
+ # RLM's API is particularly slow due to a large amount of data that is
8
+ # returned, so we bump the default Net::HTTP read_timeout to 120 seconds
9
+ # opposed to the default of 60 seconds
10
+ read_timeout 120
11
+
12
+ def endpoint_path
13
+ "#{RlmLogistics.endpoint_path}/services"
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,25 @@
1
+ module RlmLogistics
2
+ module Helpers
3
+ module AuthenticationHelper
4
+
5
+ def authenticate(options = {})
6
+ options = default_options.merge(options)
7
+ self.attribute :authentication, Hash, options
8
+ end
9
+
10
+ private
11
+
12
+ def authentication_hash
13
+ {
14
+ username: "",
15
+ key_value: ""
16
+ }
17
+ end
18
+
19
+ def default_options
20
+ { default: authentication_hash }
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,18 @@
1
+ module RlmLogistics
2
+ module Record
3
+ class Address < Base
4
+
5
+ attribute :name, String, as: :name
6
+ attribute :address1, String, as: :address1
7
+ attribute :address2, String, as: :address2
8
+ attribute :city, String, as: :city
9
+ attribute :state, String, as: :state
10
+ attribute :zip, String, as: :zip
11
+ attribute :country_code, String, as: :country_code
12
+ attribute :address_type, String, as: :address_type
13
+
14
+ validates_presence_of :name, :address1, :city, :state, :zip, :address_type
15
+
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,35 @@
1
+ require 'rlm_logistics/helpers/authentication_helper'
2
+
3
+ module RlmLogistics
4
+ module Record
5
+ class Base < ActiveRecord::Remote::Base
6
+
7
+ extend RlmLogistics::Helpers::AuthenticationHelper
8
+
9
+ api_type :soap
10
+
11
+ base_element "filterXML"
12
+
13
+ def custom_options
14
+ { authentication: credentials, company_number: RlmLogistics.company }
15
+ end
16
+
17
+ def credentials
18
+ {
19
+ username: RlmLogistics.username,
20
+ key_value: RlmLogistics.password
21
+ }
22
+ end
23
+
24
+ def soap_options
25
+ super.merge(
26
+ root: "ITEM_FILTER",
27
+ namespace: "http://ws.rlm.com",
28
+ operation: self.class.operation_path,
29
+ base_element: self.class.base_element_name
30
+ )
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,21 @@
1
+ require 'rlm_logistics/record/read_attributes/credit_read_attributes'
2
+
3
+ module RlmLogistics
4
+ module Record
5
+ class Credit < Base
6
+
7
+ action "Billing"
8
+ operation "getCredits"
9
+
10
+ authenticate
11
+
12
+ attribute :company_number
13
+ attribute :division_number
14
+ attribute :date_from
15
+ attribute :date_to
16
+
17
+ validates_presence_of :company_number
18
+
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,34 @@
1
+ require 'rlm_logistics/record/read_attributes/inventory_read_attributes'
2
+
3
+ module RlmLogistics
4
+ module Record
5
+ class Inventory < Base
6
+
7
+ action "Item"
8
+ operation "getInventory"
9
+
10
+ authenticate
11
+
12
+ attribute :company_number
13
+ attribute :division_number
14
+ attribute :season_code
15
+ attribute :season_year
16
+ attribute :internal_sku_number, Integer
17
+ attribute :style_number
18
+ attribute :fabric
19
+ attribute :length
20
+ attribute :warehouse
21
+ attribute :retrieve_upcs
22
+ attribute :ats_positive
23
+ attribute :ats_includes_wip
24
+ attribute :ats_includes_openorders
25
+ attribute :limit_rows
26
+ attribute :upcs
27
+ attribute :minimal_results
28
+ attribute :required_data_only
29
+
30
+ validates_presence_of :company_number
31
+
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,28 @@
1
+ require 'rlm_logistics/record/read_attributes/item_read_attributes'
2
+
3
+ module RlmLogistics
4
+ module Record
5
+ class Item < Base
6
+
7
+ action "Item"
8
+ operation "getSelected"
9
+
10
+ authenticate
11
+
12
+ attribute :company_number
13
+ attribute :division_number
14
+ attribute :season_code
15
+ attribute :season_year
16
+ attribute :style_number
17
+ attribute :web_ready_only
18
+ attribute :currency_type
19
+ attribute :omit_discontinued
20
+ attribute :retrieve_upcs
21
+ attribute :start_row
22
+ attribute :limit_rows
23
+
24
+ validates_presence_of :company_number
25
+
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,22 @@
1
+ module RlmLogistics
2
+ module Record
3
+ class Line < Base
4
+
5
+ attribute :sku_number, Integer, as: :SKUNumber
6
+ attribute :style, String, as: :style
7
+ attribute :color, String, as: :color
8
+ attribute :size, String, as: :size
9
+ attribute :price, Decimal, as: :price
10
+ attribute :quantity, Integer, as: :quantity
11
+ attribute :line_tax_amount, Decimal, as: :lineTaxAmount
12
+ attribute :line_state_tax_amount, Decimal, as: :lineStateTaxAmount
13
+ attribute :line_country_tax_amount, Decimal, as: :lineCountryTaxAmount
14
+ attribute :line_city_tax_amount, Decimal, as: :lineCityTaxAmount
15
+ attribute :line_other_tax_amount, Decimal, as: :lineOtherTaxAmount
16
+ attribute :line_tax_percent, Decimal, as: :lineTaxPercent
17
+
18
+ validates_presence_of :sku_number, :color, :size, :price, :quantity
19
+
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,24 @@
1
+ require 'rlm_logistics/record/read_attributes/packed_order_read_attributes'
2
+
3
+ module RlmLogistics
4
+ module Record
5
+ class PackedOrder < Base
6
+
7
+ action "PackedOrders"
8
+ operation "getSelected"
9
+
10
+ authenticate
11
+
12
+ attribute :company_number
13
+ attribute :division_number
14
+ attribute :rlm_pickticket_number
15
+ attribute :rlm_order_number
16
+ attribute :customer_po
17
+ attribute :date_from
18
+ attribute :date_to
19
+
20
+ validates_presence_of :company_number
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,15 @@
1
+ module CreditReadAttributes
2
+
3
+ def self.extended(base)
4
+ base.class.attribute :season_year
5
+ base.class.attribute :style
6
+ base.class.attribute :skunumber
7
+ base.class.attribute :style_description
8
+ base.class.attribute :color
9
+ base.class.attribute :size
10
+ base.class.attribute :upc_number
11
+ base.class.attribute :units
12
+ base.class.attribute :unit_price
13
+ end
14
+
15
+ end
@@ -0,0 +1,9 @@
1
+ module InventoryReadAttributes
2
+
3
+ def self.extended(base)
4
+ base.class.attribute :ats
5
+ base.class.attribute :color
6
+ base.class.attribute :sizes
7
+ end
8
+
9
+ end
@@ -0,0 +1,145 @@
1
+ module ItemReadAttributes
2
+
3
+ def self.extended(base)
4
+ base.class.attribute :company_name
5
+ base.class.attribute :division_name
6
+ base.class.attribute :season_formatted
7
+ base.class.attribute :season_formatted_noseparator
8
+ base.class.attribute :season_name
9
+ base.class.attribute :deliveries_by_color
10
+ base.class.attribute :delivery_period
11
+ base.class.attribute :delivery_period_description
12
+ base.class.attribute :delivery_period_from_date
13
+ base.class.attribute :delivery_period_to_date
14
+ base.class.attribute :style_delivery_period
15
+ base.class.attribute :internal_sku_number
16
+ base.class.attribute :fabric
17
+ base.class.attribute :fabric_description
18
+ base.class.attribute :length
19
+ base.class.attribute :length_description
20
+ base.class.attribute :style_name
21
+ base.class.attribute :style_name_additional
22
+ base.class.attribute :ws_price_01
23
+ base.class.attribute :ws_price_02
24
+ base.class.attribute :ws_price_03
25
+ base.class.attribute :ws_price_04
26
+ base.class.attribute :ws_price_05
27
+ base.class.attribute :ws_price_06
28
+ base.class.attribute :ws_price_07
29
+ base.class.attribute :ws_price_08
30
+ base.class.attribute :retail_price
31
+ base.class.attribute :retail_price_02
32
+ base.class.attribute :retail_price_03
33
+ base.class.attribute :retail_price_04
34
+ base.class.attribute :retail_price_05
35
+ base.class.attribute :retail_price_06
36
+ base.class.attribute :retail_price_07
37
+ base.class.attribute :retail_price_08
38
+ base.class.attribute :cost
39
+ base.class.attribute :default_fgpo_price
40
+ base.class.attribute :group_code
41
+ base.class.attribute :group_name
42
+ base.class.attribute :group_material_content
43
+ base.class.attribute :group_line_sheet_sequence
44
+ base.class.attribute :category_code
45
+ base.class.attribute :category_name
46
+ base.class.attribute :category_sequence
47
+ base.class.attribute :size_scale_01
48
+ base.class.attribute :size_scale_02
49
+ base.class.attribute :size_scale_03
50
+ base.class.attribute :unit_of_measure
51
+ base.class.attribute :quota_category
52
+ base.class.attribute :hts_number_01
53
+ base.class.attribute :country_of_origin
54
+ base.class.attribute :userdef1_code
55
+ base.class.attribute :userdef1_description
56
+ base.class.attribute :userdef2_code
57
+ base.class.attribute :userdef2_description
58
+ base.class.attribute :userdef3_code
59
+ base.class.attribute :userdef3_description
60
+ base.class.attribute :userdef4_code
61
+ base.class.attribute :userdef4_description
62
+ base.class.attribute :userdef5_code
63
+ base.class.attribute :userdef5_description
64
+ base.class.attribute :userdef6_code
65
+ base.class.attribute :userdef6_description
66
+ base.class.attribute :discontinued_flag
67
+ base.class.attribute :royalty_code
68
+ base.class.attribute :edi_flag
69
+ base.class.attribute :edi_selection_code
70
+ base.class.attribute :lead_time_in_days
71
+ base.class.attribute :factory_number
72
+ base.class.attribute :weight
73
+ base.class.attribute :measurement_length
74
+ base.class.attribute :measurement_height
75
+ base.class.attribute :measurement_width
76
+ base.class.attribute :material_content_code
77
+ base.class.attribute :material_content_description
78
+ base.class.attribute :material_group_content
79
+ base.class.attribute :gender
80
+ base.class.attribute :gender_description
81
+ base.class.attribute :sub_division_code
82
+ base.class.attribute :sub_division_description
83
+ base.class.attribute :sub_category_code
84
+ base.class.attribute :sub_category_description
85
+ base.class.attribute :sub_category_sequence
86
+ base.class.attribute :long_description
87
+ base.class.attribute :styling_description
88
+ base.class.attribute :addl_trim_description
89
+ base.class.attribute :item_cross_reference
90
+ base.class.attribute :upclabel_desc1
91
+ base.class.attribute :web_ready
92
+ base.class.attribute :sent_ecommerce
93
+ base.class.attribute :div_cat_subcat
94
+ base.class.attribute :body_type_code
95
+ base.class.attribute :body_type_description
96
+ base.class.attribute :sty_category1_code
97
+ base.class.attribute :sty_category1_description
98
+ base.class.attribute :sty_category2_code
99
+ base.class.attribute :sty_category2_description
100
+ base.class.attribute :fabrication_code
101
+ base.class.attribute :fabrication_description
102
+ base.class.attribute :garment_type_code
103
+ base.class.attribute :garment_type_description
104
+ base.class.attribute :material_type_code
105
+ base.class.attribute :material_type_description
106
+ base.class.attribute :main_material_code
107
+ base.class.attribute :main_material_description
108
+ base.class.attribute :main_material_content
109
+ base.class.attribute :nrf_code
110
+ base.class.attribute :hang_tag1_code
111
+ base.class.attribute :hang_tag1_description
112
+ base.class.attribute :hang_tag2_code
113
+ base.class.attribute :hang_tag2_description
114
+ base.class.attribute :hang_tag3_code
115
+ base.class.attribute :hang_tag3_description
116
+ base.class.attribute :hang_tag4_code
117
+ base.class.attribute :hang_tag4_description
118
+ base.class.attribute :hang_tag5_code
119
+ base.class.attribute :hang_tag5_description
120
+ base.class.attribute :hang_tag6_code
121
+ base.class.attribute :hang_tag6_description
122
+ base.class.attribute :hang_tag7_code
123
+ base.class.attribute :hang_tag7_description
124
+ base.class.attribute :hang_tag8_code
125
+ base.class.attribute :hang_tag8_description
126
+ base.class.attribute :hang_tag9_code
127
+ base.class.attribute :hang_tag9_description
128
+ base.class.attribute :hang_tag10_code
129
+ base.class.attribute :hang_tag10_description
130
+ base.class.attribute :user_created
131
+ base.class.attribute :date_created_yyyymmdd
132
+ base.class.attribute :sku_color
133
+ base.class.attribute :color
134
+ base.class.attribute :color_description
135
+ base.class.attribute :super_color
136
+ base.class.attribute :line_list_page
137
+ base.class.attribute :line_list_position
138
+ base.class.attribute :image_url
139
+ base.class.attribute :photo_url
140
+ base.class.attribute :color_photo_url
141
+ base.class.attribute :currency
142
+ base.class.attribute :sizes
143
+ base.class.attribute :upcs
144
+ end
145
+ end
@@ -0,0 +1,21 @@
1
+ module PackedOrderReadAttributes
2
+
3
+ def self.extended(base)
4
+ base.class.attribute :company_name
5
+ base.class.attribute :division_name
6
+ base.class.attribute :customer_number
7
+ base.class.attribute :customer_name
8
+ base.class.attribute :store_number
9
+ base.class.attribute :store_name
10
+ base.class.attribute :store_email_address
11
+ base.class.attribute :customerpo_number
12
+ base.class.attribute :packed_date
13
+ base.class.attribute :routing_code
14
+ base.class.attribute :routing_description
15
+ base.class.attribute :tracking_number
16
+ base.class.attribute :clearpath_customer_number
17
+ base.class.attribute :clearpath_customer_id
18
+ base.class.attribute :rec_details
19
+ end
20
+
21
+ end
@@ -0,0 +1,53 @@
1
+ module RlmLogistics
2
+ module Record
3
+ class SalesOrder < Base
4
+
5
+ action "SalesOrderNoAccount"
6
+ operation "create"
7
+ base_element "orderXML"
8
+
9
+ authenticate strict: true
10
+
11
+ attribute :id
12
+ attribute :company_number, Integer, as: :company
13
+ attribute :division_number, Integer, as: :division
14
+ attribute :single_division, String, as: :singleDivision
15
+ attribute :email, String, as: :email
16
+ attribute :currency, String, as: :currency
17
+ attribute :routing, String, as: :routing
18
+ attribute :terms, Integer, as: :terms
19
+ attribute :warehouse, Integer, as: :warehouse
20
+ attribute :sales_rep, String, as: :salesRep
21
+ attribute :department, String, as: :department
22
+ attribute :order_date, Integer, as: :orderDate
23
+ attribute :start_date, Integer, as: :startDate
24
+ attribute :cancel_date, Integer, as: :cancelDate
25
+ attribute :customer_po, String, as: :customerPO
26
+ attribute :special01, String, as: :special01
27
+ attribute :special02, String, as: :special02
28
+ attribute :special03, String, as: :special03
29
+ attribute :special04, String, as: :special04
30
+ attribute :discount, Decimal, as: :discount
31
+ attribute :tax_id, String, as: :taxID
32
+ attribute :tax_amount, String, as: :taxAmount
33
+ attribute :shipping_amount, String, as: :shippingAmount
34
+ attribute :rush_pt, String, as: :rushPT
35
+ attribute :bulk_flag, String, as: :bulkFlag
36
+
37
+ has_many :addresses, strict: true
38
+ has_many :details, collection: :line, strict: true
39
+
40
+ validates_presence_of :company_number, :currency, :order_date, :start_date,
41
+ :cancel_date, :addresses, :details
42
+
43
+ def soap_options
44
+ super.merge(root: "order")
45
+ end
46
+
47
+ def parse(response)
48
+ self.id = response.data.to_i
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,77 @@
1
+ module RlmLogistics
2
+ class Response < ActiveRecord::Remote::Response
3
+
4
+ def handle_response(response)
5
+ body_string = remove_junk(response.body)
6
+ hash = Hash.from_xml(body_string)
7
+ soap_body = hash["Envelope"]["Body"]
8
+ @parsed_response = soap_body["#{operation}Response"]["#{operation}Return"]
9
+ if valid? && record_instance.respond_to?(:parse)
10
+ record_instance.parse(self)
11
+ else
12
+ record_instance.errors.add(:base, response_message)
13
+ end
14
+ self
15
+ end
16
+
17
+ def response_message
18
+ parsed_response["RESPONSE"]["DESCRIPTION"]
19
+ end
20
+
21
+ def data
22
+ if record_instance.class.to_s.match(/inventory|item|packed/i)
23
+ parsed_response["RESPONSE"]["DATA"]["RECSET"]["REC"]
24
+ elsif record_instance.class.to_s.match(/credit/i)
25
+ return nil if parsed_response["RESPONSE"]["DATA"]["RECSET"].nil?
26
+ parsed_response["RESPONSE"]["DATA"]["RECSET"]["REC"]["REC_DETAILS"]["DETAIL"]
27
+ elsif record_instance.class.to_s.match(/salesorder/i)
28
+ parsed_response["RESPONSE"]["ORDER_NUMBER"]
29
+ else
30
+ parsed_response
31
+ end
32
+ end
33
+
34
+ def valid?
35
+ case response_code
36
+ when "0"
37
+ false
38
+ when "1"
39
+ true
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def remove_junk(string)
46
+ # Here we cleanup the response from RLM since their responses can be
47
+ # quite large for inventory requests. As well we convert their escaped
48
+ # xml string into valid xml so it can be parsed once
49
+ string.gsub!("\n", "")
50
+ string.gsub!("&lt;?xml version=&quot;1.0&quot; ", "")
51
+ string.gsub!("encoding=&quot;UTF-8&quot; ?&gt;", "")
52
+ if record_instance.try(:minimal_results)
53
+ # cuts out the majority of fields in response
54
+ # down to only `UPCS` and `ATS`
55
+ string.gsub!(/\&lt\;COMPANY(.*?)\/SIZES\&gt\;/i, '')
56
+ end
57
+ if record_instance.try(:required_data_only)
58
+ # cuts out the majority of fields in response down to only
59
+ # `INTERNAL_SKU_NUMBER`, `STYLE_NUMBER`, `COLOR`, `SIZES`, `UPCS`
60
+ string.gsub!(/\&lt\;COMPANY(.*?)\/SEASON_YEAR\&gt\;/i, '')
61
+ string.gsub!(/\&lt\;FABRIC(.*?)\/LENGTH\&gt\;/i, '')
62
+ string.gsub!(/\&lt\;SKU_COLOR(.*?)\/ITEM_CROSS_REFERENCE\&gt\;/i, '')
63
+ string.gsub!(/\&lt\;ATS(.*?)\/ATS\&gt\;/i, '')
64
+ end
65
+ string.gsub!("&lt;", "<")
66
+ string.gsub!("&gt;", ">")
67
+ string.gsub!("\\", "")
68
+ string.gsub!("&quot;", '"')
69
+ string
70
+ end
71
+
72
+ def response_code
73
+ parsed_response["RESPONSE"]["CODE"]
74
+ end
75
+
76
+ end
77
+ end
@@ -0,0 +1,3 @@
1
+ module RlmLogistics
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rlm_logistics/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rlm_logistics"
8
+ spec.version = RlmLogistics::VERSION
9
+ spec.authors = ["Justin Grubbs"]
10
+ spec.email = ["justin@jgrubbs.net"]
11
+
12
+ spec.summary = %q{Ruby API wrapper for RLM logistics}
13
+ spec.description = %q{Ruby API wrapper for RLM logistics}
14
+ spec.homepage = "https://github.com/jGRUBBS/rlm_logistics"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "active_record-remote", "~> 0.0.1"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.10"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "rspec"
26
+ spec.add_development_dependency "debugger"
27
+ spec.add_development_dependency "vcr"
28
+ spec.add_development_dependency "webmock"
29
+ end
metadata ADDED
@@ -0,0 +1,168 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rlm_logistics
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Justin Grubbs
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-03-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: active_record-remote
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.10'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.10'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: debugger
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: vcr
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: webmock
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Ruby API wrapper for RLM logistics
112
+ email:
113
+ - justin@jgrubbs.net
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - .gitignore
119
+ - .rspec
120
+ - .ruby-version
121
+ - .travis.yml
122
+ - Gemfile
123
+ - README.md
124
+ - Rakefile
125
+ - bin/console
126
+ - bin/setup
127
+ - lib/rlm_logistics.rb
128
+ - lib/rlm_logistics/client.rb
129
+ - lib/rlm_logistics/helpers/authentication_helper.rb
130
+ - lib/rlm_logistics/record/address.rb
131
+ - lib/rlm_logistics/record/base.rb
132
+ - lib/rlm_logistics/record/credit.rb
133
+ - lib/rlm_logistics/record/inventory.rb
134
+ - lib/rlm_logistics/record/item.rb
135
+ - lib/rlm_logistics/record/line.rb
136
+ - lib/rlm_logistics/record/packed_order.rb
137
+ - lib/rlm_logistics/record/read_attributes/credit_read_attributes.rb
138
+ - lib/rlm_logistics/record/read_attributes/inventory_read_attributes.rb
139
+ - lib/rlm_logistics/record/read_attributes/item_read_attributes.rb
140
+ - lib/rlm_logistics/record/read_attributes/packed_order_read_attributes.rb
141
+ - lib/rlm_logistics/record/sales_order.rb
142
+ - lib/rlm_logistics/response.rb
143
+ - lib/rlm_logistics/version.rb
144
+ - rlm_logistics.gemspec
145
+ homepage: https://github.com/jGRUBBS/rlm_logistics
146
+ licenses: []
147
+ metadata: {}
148
+ post_install_message:
149
+ rdoc_options: []
150
+ require_paths:
151
+ - lib
152
+ required_ruby_version: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - '>='
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - '>='
160
+ - !ruby/object:Gem::Version
161
+ version: '0'
162
+ requirements: []
163
+ rubyforge_project:
164
+ rubygems_version: 2.4.6
165
+ signing_key:
166
+ specification_version: 4
167
+ summary: Ruby API wrapper for RLM logistics
168
+ test_files: []