seko 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +14 -0
- data/.rspec +2 -0
- data/.travis.yml +23 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +210 -0
- data/Rakefile +1 -0
- data/lib/seko/client.rb +236 -0
- data/lib/seko/company.rb +33 -0
- data/lib/seko/dispatch.rb +22 -0
- data/lib/seko/filter.rb +9 -0
- data/lib/seko/order.rb +77 -0
- data/lib/seko/product.rb +27 -0
- data/lib/seko/receipt.rb +36 -0
- data/lib/seko/response.rb +33 -0
- data/lib/seko/shipping.rb +26 -0
- data/lib/seko/stock.rb +9 -0
- data/lib/seko/tracking.rb +22 -0
- data/lib/seko/version.rb +3 -0
- data/lib/seko.rb +31 -0
- data/seko.gemspec +27 -0
- data/spec/fixtures/company_submit.json +21 -0
- data/spec/fixtures/dispatch_statuses.json +25 -0
- data/spec/fixtures/grn.json +45 -0
- data/spec/fixtures/order_status.json +11 -0
- data/spec/fixtures/order_submit.json +33 -0
- data/spec/fixtures/order_tracking.json +12 -0
- data/spec/fixtures/order_websubmit.json +29 -0
- data/spec/fixtures/product_submit.json +15 -0
- data/spec/fixtures/receipt_submit.json +26 -0
- data/spec/fixtures/stock.json +29 -0
- data/spec/fixtures/stock_adjustment.json +7 -0
- data/spec/fixtures/stock_movement.json +7 -0
- data/spec/lib/client_spec.rb +364 -0
- data/spec/lib/company_spec.rb +22 -0
- data/spec/lib/dispatch_spec.rb +17 -0
- data/spec/lib/filter_spec.rb +12 -0
- data/spec/lib/order_spec.rb +60 -0
- data/spec/lib/product_spec.rb +23 -0
- data/spec/lib/receipt_spec.rb +36 -0
- data/spec/lib/response_spec.rb +53 -0
- data/spec/lib/stock_spec.rb +12 -0
- data/spec/logs/spec.log +0 -0
- data/spec/spec_helper.rb +176 -0
- metadata +196 -0
data/lib/seko/receipt.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
module Seko
|
2
|
+
class Receipt
|
3
|
+
|
4
|
+
def self.line_items(items)
|
5
|
+
items.map.collect.with_index do |item, index|
|
6
|
+
{
|
7
|
+
"LineNumber" => index + 1,
|
8
|
+
"ProductCode" => item[:upc],
|
9
|
+
"Quantity" => item[:quantity],
|
10
|
+
"SupplierCompanyCode" => Seko.config[:supplier_code]
|
11
|
+
}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.format(items, warehouse)
|
16
|
+
{
|
17
|
+
"Request" => {
|
18
|
+
"List" => {
|
19
|
+
"ReceiptLineItem" => line_items(items)
|
20
|
+
},
|
21
|
+
"Receipt" => {
|
22
|
+
"ASNNumber" => random_asn
|
23
|
+
},
|
24
|
+
"ReceiptHeader" => {
|
25
|
+
"DCCode" => warehouse
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.random_asn
|
32
|
+
rand.to_s[2..11]
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Seko
|
2
|
+
class Response
|
3
|
+
|
4
|
+
attr_accessor :raw, :parsed
|
5
|
+
|
6
|
+
def initialize(response)
|
7
|
+
@raw = response
|
8
|
+
@parsed = JSON.parse(response)
|
9
|
+
end
|
10
|
+
|
11
|
+
def root_response
|
12
|
+
@parsed["Response"].nil? ? @parsed : @parsed["Response"]
|
13
|
+
end
|
14
|
+
|
15
|
+
def success?
|
16
|
+
root_response["CallStatus"]["Success"]
|
17
|
+
end
|
18
|
+
|
19
|
+
def failure?
|
20
|
+
!success?
|
21
|
+
end
|
22
|
+
|
23
|
+
def message
|
24
|
+
message = root_response["CallStatus"]["Message"]
|
25
|
+
message.empty? ? "" : message
|
26
|
+
end
|
27
|
+
|
28
|
+
def guid
|
29
|
+
root_response["GUID"]
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Seko
|
2
|
+
class Shipping
|
3
|
+
|
4
|
+
OPTIONS = {
|
5
|
+
# UK
|
6
|
+
"BEFORE 10" => "PLPRE1000",
|
7
|
+
"BEFORE 12" => "PLPRE1200",
|
8
|
+
"NEXT DAY" => "PLNEXTDAY",
|
9
|
+
"TWO DAY" => "PLECO48",
|
10
|
+
"SAT B4 10" => "PLSATB410",
|
11
|
+
"SAT B4 12" => "PLSATB412",
|
12
|
+
# EU
|
13
|
+
"EU BY AIR" => "PLCP-EU",
|
14
|
+
# NOT SURE
|
15
|
+
"DOCUMENT BY AIR" => "PLCP-WED",
|
16
|
+
"PARCEL BY AIR" => "PLNEXTCP-WEP",
|
17
|
+
"PARCEL DPD" => "PLDPD",
|
18
|
+
"SATURDAY" => "PLSAT"
|
19
|
+
}
|
20
|
+
|
21
|
+
def map(key)
|
22
|
+
OPTIONS[key] || key
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
data/lib/seko/stock.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
module Seko
|
2
|
+
class Tracking
|
3
|
+
|
4
|
+
attr_accessor :carrier
|
5
|
+
|
6
|
+
DPD = "https://tracking.dpd.de/cgi-bin/delistrack?pknr=:tracking_number&typ=32&lang=en"
|
7
|
+
|
8
|
+
def initialize(carrier, tracking_number)
|
9
|
+
@carrier = carrier
|
10
|
+
@tracking_number = tracking_number
|
11
|
+
end
|
12
|
+
|
13
|
+
def carrier_destination
|
14
|
+
self.class.const_get(carrier.upcase)
|
15
|
+
end
|
16
|
+
|
17
|
+
def url
|
18
|
+
carrier_destination.gsub(':tracking_number', @tracking_number)
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
data/lib/seko/version.rb
ADDED
data/lib/seko.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'seko/version'
|
2
|
+
require 'seko/client'
|
3
|
+
require 'seko/product'
|
4
|
+
require 'seko/response'
|
5
|
+
require 'seko/receipt'
|
6
|
+
require 'seko/stock'
|
7
|
+
require 'seko/order'
|
8
|
+
require 'seko/company'
|
9
|
+
require 'seko/dispatch'
|
10
|
+
require 'seko/filter'
|
11
|
+
require 'seko/tracking'
|
12
|
+
|
13
|
+
module Seko
|
14
|
+
|
15
|
+
@config = {
|
16
|
+
token: '',
|
17
|
+
supplier_code: '',
|
18
|
+
supplier_description: '',
|
19
|
+
supplier_uom: 1,
|
20
|
+
warehouses: {}
|
21
|
+
}
|
22
|
+
|
23
|
+
def self.configure(opts = {})
|
24
|
+
opts.each { |k,v| @config[k.to_sym] = v if @config.keys.include? k.to_sym }
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.config
|
28
|
+
@config
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
data/seko.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'seko/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "seko"
|
8
|
+
spec.version = Seko::VERSION
|
9
|
+
spec.authors = ["Justin Grubbs"]
|
10
|
+
spec.email = ["justin@jgrubbs.net"]
|
11
|
+
spec.summary = %q{A ruby wrapper for interfacing with Seko Logistics' SupplySteam iHub API}
|
12
|
+
spec.description = %q{A ruby wrapper for interfacing with Seko Logistics' SupplySteam iHub API}
|
13
|
+
spec.homepage = "https://github.com/jGRUBBS/seko-ruby-api"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
22
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
+
spec.add_development_dependency "rspec"
|
24
|
+
spec.add_development_dependency "webmock"
|
25
|
+
spec.add_development_dependency "hashie"
|
26
|
+
spec.add_development_dependency "codeclimate-test-reporter"
|
27
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
{
|
2
|
+
"Request": {
|
3
|
+
"Company": {
|
4
|
+
"CompanyCode": 123456,
|
5
|
+
"CompanyDescription": "My Test company",
|
6
|
+
"CompanyType": "Ship To"
|
7
|
+
},
|
8
|
+
"List": {
|
9
|
+
"Address": {
|
10
|
+
"AddressLine1": "The Farthings",
|
11
|
+
"AddressLine2": "Sandpits Lane",
|
12
|
+
"AddressLine3": "Beaconsfield",
|
13
|
+
"AddressType": "Delivery",
|
14
|
+
"City": "High Wycombe",
|
15
|
+
"CountryCode": "GB",
|
16
|
+
"County": "Buckinghamshire",
|
17
|
+
"PostcodeZip": "HP8 TTT"
|
18
|
+
}
|
19
|
+
}
|
20
|
+
}
|
21
|
+
}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
{
|
2
|
+
"Response": {
|
3
|
+
"CallStatus": {
|
4
|
+
"Code": 0,
|
5
|
+
"Message": {},
|
6
|
+
"Success": true
|
7
|
+
},
|
8
|
+
"List": {
|
9
|
+
"DispatchLineItem": [
|
10
|
+
{
|
11
|
+
"DCCode": "DCSOM01",
|
12
|
+
"GUID": "2b5e52cc-fb6f-4ea4-b8cf-cf64e3a2b8db"
|
13
|
+
},
|
14
|
+
{
|
15
|
+
"DCCode": "DCSOM01",
|
16
|
+
"GUID": "93e92ca2-725a-46f8-90dd-43a16105f78d"
|
17
|
+
},
|
18
|
+
{
|
19
|
+
"DCCode": "DCSOM01",
|
20
|
+
"GUID": "143544ec-f396-4155-95c6-bf59898e0830"
|
21
|
+
}
|
22
|
+
]
|
23
|
+
}
|
24
|
+
}
|
25
|
+
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
{
|
2
|
+
"Response": {
|
3
|
+
"CallStatus": {
|
4
|
+
"Code":0,
|
5
|
+
"Message":{},
|
6
|
+
"Success":true
|
7
|
+
},
|
8
|
+
"List": {
|
9
|
+
"GRNResponseItem": [
|
10
|
+
{
|
11
|
+
"ArrivalTimestamp": "2014-10-10T15:45:12Z",
|
12
|
+
"ConfirmedTimestamp": "2014-10-10T15:45:54Z",
|
13
|
+
"CurrentStatus": "Confirmed",
|
14
|
+
"DCCode": {},
|
15
|
+
"GRNQuantity": 10,
|
16
|
+
"GRNType": {},
|
17
|
+
"GUID": "5b2dcd8e-52c3-4e27-a712-eaacda2dd8fe",
|
18
|
+
"HBRef": {},
|
19
|
+
"InternalId": {},
|
20
|
+
"LineInternalId": {},
|
21
|
+
"LineItemGUID": "9213df2b-8191-4c24-a687-8d7d3dca40bb",
|
22
|
+
"LineItemNumber": 1,
|
23
|
+
"ProductCode": {},
|
24
|
+
"ReceivingStartTimestamp": "2014-10-10T15:45:27Z"
|
25
|
+
},
|
26
|
+
{
|
27
|
+
"ArrivalTimestamp": "2014-10-10T15:45:12Z",
|
28
|
+
"ConfirmedTimestamp": "2014-10-10T15:45:54Z",
|
29
|
+
"CurrentStatus": "Confirmed",
|
30
|
+
"DCCode": {},
|
31
|
+
"GRNQuantity": 10,
|
32
|
+
"GRNType": {},
|
33
|
+
"GUID": "5b2dcd8e-52c3-4e27-a712-eaacda2dd8fe",
|
34
|
+
"HBRef": {},
|
35
|
+
"InternalId": {},
|
36
|
+
"LineInternalId": {},
|
37
|
+
"LineItemGUID": "8359e44d-40eb-4db5-92ed-5998304d8a3b",
|
38
|
+
"LineItemNumber": 2,
|
39
|
+
"ProductCode": {},
|
40
|
+
"ReceivingStartTimestamp": "2014-10-10T15:45:27Z"
|
41
|
+
}
|
42
|
+
]
|
43
|
+
}
|
44
|
+
}
|
45
|
+
}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
{
|
2
|
+
"Request": {
|
3
|
+
"DeliveryDetails": {
|
4
|
+
"City": "Windsor",
|
5
|
+
"CountryCode": "GB",
|
6
|
+
"EmailAddress": "stephen.jones@gmail.com",
|
7
|
+
"FirstName": "Stephen",
|
8
|
+
"LastName": "Jones",
|
9
|
+
"Line1": "23 Victoria Street",
|
10
|
+
"Line2": "",
|
11
|
+
"PhoneNumber": "0123 336 6676",
|
12
|
+
"PostcodeZip": "SL4 1HE"
|
13
|
+
},
|
14
|
+
"List": {
|
15
|
+
"SalesOrderLineItem": [
|
16
|
+
{
|
17
|
+
"LineNumber": 1,
|
18
|
+
"ProductCode": 100083,
|
19
|
+
"Quantity": 2
|
20
|
+
}
|
21
|
+
]
|
22
|
+
},
|
23
|
+
"SalesOrderHeader": { "DCCode": "DC123" },
|
24
|
+
"SalesOrder": {
|
25
|
+
"SalesOrderDate": "2013-12-12",
|
26
|
+
"SalesOrderNumber": 123456
|
27
|
+
},
|
28
|
+
"ShipToCompany": {
|
29
|
+
"CompanyCode": "IND001",
|
30
|
+
"CompanyDescription": "Indigina"
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
{
|
2
|
+
"Request": {
|
3
|
+
"DeliveryDetails": {
|
4
|
+
"City": "Windsor",
|
5
|
+
"CountryCode": "GB",
|
6
|
+
"EmailAddress": "stephen.jones@gmail.com",
|
7
|
+
"FirstName": "Stephen",
|
8
|
+
"LastName": "Jones",
|
9
|
+
"Line1": "23 Victoria Street",
|
10
|
+
"Line2": "",
|
11
|
+
"PhoneNumber": "0123 336 6676",
|
12
|
+
"PostcodeZip": "SL4 1HE"
|
13
|
+
},
|
14
|
+
"List": {
|
15
|
+
"SalesOrderLineItem": [
|
16
|
+
{
|
17
|
+
"LineNumber": 1,
|
18
|
+
"ProductCode": 100083,
|
19
|
+
"Quantity": 2
|
20
|
+
}
|
21
|
+
]
|
22
|
+
},
|
23
|
+
"SalesOrderHeader": { "DCCode": "DC123" },
|
24
|
+
"WebSalesOrder": {
|
25
|
+
"SalesOrderDate": "2013-12-12",
|
26
|
+
"SalesOrderNumber": 123456
|
27
|
+
}
|
28
|
+
}
|
29
|
+
}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
{
|
2
|
+
"Request": {
|
3
|
+
"List": {
|
4
|
+
"ReceiptLineItem": [
|
5
|
+
{
|
6
|
+
"LineNumber": 1,
|
7
|
+
"ProductCode": 100083,
|
8
|
+
"Quantity": 10,
|
9
|
+
"SupplierCompanyCode": "Supplier1"
|
10
|
+
},
|
11
|
+
{
|
12
|
+
"LineNumber": 2,
|
13
|
+
"ProductCode": 100076,
|
14
|
+
"Quantity": 15,
|
15
|
+
"SupplierCompanyCode": "Supplier1"
|
16
|
+
}
|
17
|
+
]
|
18
|
+
},
|
19
|
+
"Receipt": {
|
20
|
+
"ASNNumber": 123456
|
21
|
+
},
|
22
|
+
"ReceiptHeader": {
|
23
|
+
"DCCode": "DC123"
|
24
|
+
}
|
25
|
+
}
|
26
|
+
}
|
@@ -0,0 +1,29 @@
|
|
1
|
+
{
|
2
|
+
"Response": {
|
3
|
+
"List": {
|
4
|
+
"StockQuantityLineItem": [
|
5
|
+
{
|
6
|
+
"DCCode": {},
|
7
|
+
"EAN": {},
|
8
|
+
"FreeQuantity": 0,
|
9
|
+
"LocationType": "Available",
|
10
|
+
"ProductCode": 100014
|
11
|
+
},
|
12
|
+
{
|
13
|
+
"DCCode": {},
|
14
|
+
"EAN": {},
|
15
|
+
"FreeQuantity": 10,
|
16
|
+
"LocationType": "Available",
|
17
|
+
"ProductCode": 100015
|
18
|
+
},
|
19
|
+
{
|
20
|
+
"DCCode": {},
|
21
|
+
"EAN": {},
|
22
|
+
"FreeQuantity": 20,
|
23
|
+
"LocationType": "Available",
|
24
|
+
"ProductCode": 100016
|
25
|
+
}
|
26
|
+
]
|
27
|
+
}
|
28
|
+
}
|
29
|
+
}
|