seko 0.0.1

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.
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
+ }