seko 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +14 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +23 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +210 -0
  8. data/Rakefile +1 -0
  9. data/lib/seko/client.rb +236 -0
  10. data/lib/seko/company.rb +33 -0
  11. data/lib/seko/dispatch.rb +22 -0
  12. data/lib/seko/filter.rb +9 -0
  13. data/lib/seko/order.rb +77 -0
  14. data/lib/seko/product.rb +27 -0
  15. data/lib/seko/receipt.rb +36 -0
  16. data/lib/seko/response.rb +33 -0
  17. data/lib/seko/shipping.rb +26 -0
  18. data/lib/seko/stock.rb +9 -0
  19. data/lib/seko/tracking.rb +22 -0
  20. data/lib/seko/version.rb +3 -0
  21. data/lib/seko.rb +31 -0
  22. data/seko.gemspec +27 -0
  23. data/spec/fixtures/company_submit.json +21 -0
  24. data/spec/fixtures/dispatch_statuses.json +25 -0
  25. data/spec/fixtures/grn.json +45 -0
  26. data/spec/fixtures/order_status.json +11 -0
  27. data/spec/fixtures/order_submit.json +33 -0
  28. data/spec/fixtures/order_tracking.json +12 -0
  29. data/spec/fixtures/order_websubmit.json +29 -0
  30. data/spec/fixtures/product_submit.json +15 -0
  31. data/spec/fixtures/receipt_submit.json +26 -0
  32. data/spec/fixtures/stock.json +29 -0
  33. data/spec/fixtures/stock_adjustment.json +7 -0
  34. data/spec/fixtures/stock_movement.json +7 -0
  35. data/spec/lib/client_spec.rb +364 -0
  36. data/spec/lib/company_spec.rb +22 -0
  37. data/spec/lib/dispatch_spec.rb +17 -0
  38. data/spec/lib/filter_spec.rb +12 -0
  39. data/spec/lib/order_spec.rb +60 -0
  40. data/spec/lib/product_spec.rb +23 -0
  41. data/spec/lib/receipt_spec.rb +36 -0
  42. data/spec/lib/response_spec.rb +53 -0
  43. data/spec/lib/stock_spec.rb +12 -0
  44. data/spec/logs/spec.log +0 -0
  45. data/spec/spec_helper.rb +176 -0
  46. metadata +196 -0
@@ -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,9 @@
1
+ module Seko
2
+ class Stock
3
+
4
+ def self.parse(response)
5
+ response.root_response["List"]["StockQuantityLineItem"]
6
+ end
7
+
8
+ end
9
+ end
@@ -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
@@ -0,0 +1,3 @@
1
+ module Seko
2
+ VERSION = "0.0.1"
3
+ end
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,11 @@
1
+ {
2
+ "Response": {
3
+ "CallStatus": {
4
+ "Code": 0,
5
+ "Message": {},
6
+ "Success": true
7
+ },
8
+ "GUID": "f66fd245-7b9e-4fd2-9dbf-5631edc875d9",
9
+ "Status": "To Be Picked"
10
+ }
11
+ }
@@ -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,12 @@
1
+ {
2
+ "Response": {
3
+ "CallStatus": {
4
+ "Code": 0,
5
+ "Message": {},
6
+ "Success": true
7
+ },
8
+ "Courier": {},
9
+ "GUID": "f66fd245-7b9e-4fd2-9dbf-5631edc875d9",
10
+ "TrackingNumber": {}
11
+ }
12
+ }
@@ -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,15 @@
1
+ {
2
+ "Request": {
3
+ "List": {
4
+ "SupplierMapping": {
5
+ "SupplierCode": "Supplier1",
6
+ "SupplierDescription": "My Supplier",
7
+ "UOM": 1
8
+ }
9
+ },
10
+ "ProductMaster": {
11
+ "ProductCode": 123456,
12
+ "ProductDescription": "A Test Product"
13
+ }
14
+ }
15
+ }
@@ -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
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "CallStatus": {
3
+ "Success": true,
4
+ "Code": 100,
5
+ "Message": "update with actual adjustments response once some orders have been picked and shipped"
6
+ }
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "CallStatus": {
3
+ "Success": true,
4
+ "Code": 100,
5
+ "Message": "update with actual movements response once some orders have been picked and shipped"
6
+ }
7
+ }