ship_compliant 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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.travis.yml +8 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +22 -0
- data/README.md +50 -0
- data/Rakefile +47 -0
- data/cucumber.yml +9 -0
- data/features/add_update_brand.feature +20 -0
- data/features/add_update_product.feature +24 -0
- data/features/check_compliance_of_sales_order_with_address_validations.feature +18 -0
- data/features/commit_sales_order.feature +6 -0
- data/features/get_inventory_details.feature +7 -0
- data/features/get_sales_order_extended.feature +15 -0
- data/features/search_sales_orders.feature +13 -0
- data/features/step_definitions/brand_steps.rb +73 -0
- data/features/step_definitions/commit_sales_order/all_shipments.rb +15 -0
- data/features/step_definitions/compliance_check/available_product_steps.rb +175 -0
- data/features/step_definitions/compliance_check/missing_product_steps.rb +102 -0
- data/features/step_definitions/compliance_check/noncompliant_product.rb +102 -0
- data/features/step_definitions/credential_steps.rb +8 -0
- data/features/step_definitions/inventory_steps.rb +36 -0
- data/features/step_definitions/product_steps.rb +140 -0
- data/features/step_definitions/sales_order_extended_steps.rb +79 -0
- data/features/step_definitions/search_order_steps.rb +87 -0
- data/features/step_definitions/void_order_steps.rb +27 -0
- data/features/support/env.rb +14 -0
- data/features/void_sales_order.feature +11 -0
- data/fixtures/vcr_cassettes/brand_already_exists.yml +1038 -0
- data/fixtures/vcr_cassettes/brand_ignore_existing.yml +1037 -0
- data/fixtures/vcr_cassettes/brand_update_existing.yml +1037 -0
- data/fixtures/vcr_cassettes/brand_valid.yml +1037 -0
- data/fixtures/vcr_cassettes/commit_salesorder_all_shipments.yml +1034 -0
- data/fixtures/vcr_cassettes/compliance_available_product.yml +1075 -0
- data/fixtures/vcr_cassettes/compliance_missing_product.yml +1046 -0
- data/fixtures/vcr_cassettes/compliance_noncompliant_product.yml +1082 -0
- data/fixtures/vcr_cassettes/ignore_existing_product.yml +1035 -0
- data/fixtures/vcr_cassettes/invalid_search_sales_orders.yml +1038 -0
- data/fixtures/vcr_cassettes/inventory_details_for_everything.yml +1037 -0
- data/fixtures/vcr_cassettes/product_already_exists.yml +1036 -0
- data/fixtures/vcr_cassettes/product_invalid_brand.yml +1036 -0
- data/fixtures/vcr_cassettes/product_valid_brand.yml +1035 -0
- data/fixtures/vcr_cassettes/sales_order_extended.yml +1042 -0
- data/fixtures/vcr_cassettes/sales_order_missing.yml +1034 -0
- data/fixtures/vcr_cassettes/search_sales_orders.yml +1039 -0
- data/fixtures/vcr_cassettes/update_product.yml +1035 -0
- data/fixtures/vcr_cassettes/void_order.yml +1033 -0
- data/fixtures/vcr_cassettes/void_voided_order.yml +1034 -0
- data/lib/ship_compliant.rb +62 -0
- data/lib/ship_compliant/add_update_brand.rb +50 -0
- data/lib/ship_compliant/add_update_brand_result.rb +6 -0
- data/lib/ship_compliant/add_update_product.rb +66 -0
- data/lib/ship_compliant/add_update_product_result.rb +6 -0
- data/lib/ship_compliant/address.rb +87 -0
- data/lib/ship_compliant/address/suggested_address.rb +37 -0
- data/lib/ship_compliant/base_result.rb +43 -0
- data/lib/ship_compliant/channel_details.rb +31 -0
- data/lib/ship_compliant/check_compliance.rb +41 -0
- data/lib/ship_compliant/check_compliance_result.rb +95 -0
- data/lib/ship_compliant/client.rb +54 -0
- data/lib/ship_compliant/commit_sales_order.rb +48 -0
- data/lib/ship_compliant/commit_sales_order_result.rb +30 -0
- data/lib/ship_compliant/compliance_rule.rb +30 -0
- data/lib/ship_compliant/configuration.rb +46 -0
- data/lib/ship_compliant/error_result.rb +41 -0
- data/lib/ship_compliant/freight_sales_tax_rate.rb +8 -0
- data/lib/ship_compliant/get_inventory_details.rb +31 -0
- data/lib/ship_compliant/get_inventory_details_result.rb +41 -0
- data/lib/ship_compliant/get_sales_order_extended.rb +23 -0
- data/lib/ship_compliant/get_sales_order_extended_result.rb +65 -0
- data/lib/ship_compliant/inventory_product.rb +95 -0
- data/lib/ship_compliant/order_search.rb +92 -0
- data/lib/ship_compliant/package.rb +13 -0
- data/lib/ship_compliant/product_attributes.rb +98 -0
- data/lib/ship_compliant/product_sales_tax_rate.rb +23 -0
- data/lib/ship_compliant/sales_tax_rate.rb +22 -0
- data/lib/ship_compliant/search_sales_order_summary.rb +30 -0
- data/lib/ship_compliant/search_sales_orders.rb +53 -0
- data/lib/ship_compliant/search_sales_orders_result.rb +106 -0
- data/lib/ship_compliant/shipment.rb +59 -0
- data/lib/ship_compliant/shipment_compliance.rb +28 -0
- data/lib/ship_compliant/shipment_sales_tax_rate.rb +15 -0
- data/lib/ship_compliant/version.rb +3 -0
- data/lib/ship_compliant/void_sales_order.rb +42 -0
- data/lib/ship_compliant/void_sales_order_result.rb +20 -0
- data/ship_compliant.gemspec +33 -0
- data/spec/fixtures/add_update_product.xml +22 -0
- data/spec/fixtures/check_compliance.xml +125 -0
- data/spec/fixtures/coreservice.wsdl +1341 -0
- data/spec/fixtures/search_sales_orders.xml +52 -0
- data/spec/fixtures/void_order_failure.xml +31 -0
- data/spec/fixtures/void_order_success.xml +22 -0
- data/spec/lib/ship_compliant/add_update_brand_result_spec.rb +7 -0
- data/spec/lib/ship_compliant/add_update_brand_spec.rb +58 -0
- data/spec/lib/ship_compliant/add_update_product_result_spec.rb +7 -0
- data/spec/lib/ship_compliant/add_update_product_spec.rb +52 -0
- data/spec/lib/ship_compliant/address/suggested_address_spec.rb +28 -0
- data/spec/lib/ship_compliant/address_spec.rb +123 -0
- data/spec/lib/ship_compliant/base_result_spec.rb +127 -0
- data/spec/lib/ship_compliant/channel_details_spec.rb +40 -0
- data/spec/lib/ship_compliant/check_compliance_result_spec.rb +135 -0
- data/spec/lib/ship_compliant/check_compliance_spec.rb +43 -0
- data/spec/lib/ship_compliant/client_spec.rb +73 -0
- data/spec/lib/ship_compliant/commit_sales_order_result_spec.rb +32 -0
- data/spec/lib/ship_compliant/commit_sales_order_spec.rb +38 -0
- data/spec/lib/ship_compliant/compliance_rule_spec.rb +47 -0
- data/spec/lib/ship_compliant/configuration_spec.rb +47 -0
- data/spec/lib/ship_compliant/error_result_spec.rb +47 -0
- data/spec/lib/ship_compliant/freight_sales_tax_rate_spec.rb +7 -0
- data/spec/lib/ship_compliant/get_inventory_details_result_spec.rb +87 -0
- data/spec/lib/ship_compliant/get_inventory_details_spec.rb +35 -0
- data/spec/lib/ship_compliant/get_sales_order_extended_result_spec.rb +84 -0
- data/spec/lib/ship_compliant/get_sales_order_extended_spec.rb +39 -0
- data/spec/lib/ship_compliant/inventory_product_spec.rb +116 -0
- data/spec/lib/ship_compliant/order_search_spec.rb +21 -0
- data/spec/lib/ship_compliant/package_spec.rb +26 -0
- data/spec/lib/ship_compliant/product_attributes_spec.rb +36 -0
- data/spec/lib/ship_compliant/product_sales_tax_rate_spec.rb +22 -0
- data/spec/lib/ship_compliant/sales_tax_rate_spec.rb +21 -0
- data/spec/lib/ship_compliant/search_sales_order_summary_spec.rb +56 -0
- data/spec/lib/ship_compliant/search_sales_orders_result_spec.rb +121 -0
- data/spec/lib/ship_compliant/search_sales_orders_spec.rb +42 -0
- data/spec/lib/ship_compliant/shipment_compliance_spec.rb +46 -0
- data/spec/lib/ship_compliant/shipment_sales_tax_rate_spec.rb +20 -0
- data/spec/lib/ship_compliant/shipment_spec.rb +106 -0
- data/spec/lib/ship_compliant/void_sales_order_result_spec.rb +7 -0
- data/spec/lib/ship_compliant/void_sales_order_spec.rb +41 -0
- data/spec/spec_helper.rb +50 -0
- metadata +366 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4f65d2633670d76884e42d644855007e2da8ee22
|
4
|
+
data.tar.gz: 783a260776706a1f4a3aeb1ca9e6584285c4818f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 0bfe10c93c02e0b4974fe9d6d3048c08169070789449c03dea8ab2b9cb8a94891e18aa77bd8e5ec7b898032c4f89db7602273050fa267a677080c80183e2e243
|
7
|
+
data.tar.gz: 9c94b6613394e17e863323a0bc9455aeacab931556cd5bd9bf4ade86bd5a5c1713175747b1106911372209e9fdf0c9d37f2789373b8fbbdf7470e120e9d15570
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Baylor Rae'
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# ShipCompliant - Ruby API Client
|
2
|
+
|
3
|
+
The ShipCompliant gem is an API Client for the [SOAP][soap_wiki] API provided by
|
4
|
+
ShipCompliant. This gem has been created for fast implementation and supports
|
5
|
+
the 9 main API calls.
|
6
|
+
|
7
|
+
[Documentation][documentation_path] | [RDoc][rdoc_path] | [CoreService V1.2][core_service_path]
|
8
|
+
|
9
|
+
[](https://travis-ci.org/BaylorRae/ship\_compliant-ruby) [](https://codeclimate.com/github/BaylorRae/ship_compliant-ruby)
|
10
|
+
|
11
|
+
## Installation
|
12
|
+
|
13
|
+
Add this line to your application's Gemfile:
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
gem 'ship_compliant'
|
17
|
+
```
|
18
|
+
|
19
|
+
And then execute:
|
20
|
+
|
21
|
+
```bash
|
22
|
+
$ bundle install
|
23
|
+
```
|
24
|
+
|
25
|
+
Add this to `config/initializers/ship_compliant.rb`
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
ShipCompliant.configure do |c|
|
29
|
+
c.partner_key = ENV.fetch('SHIP_COMPLIANT_KEY')
|
30
|
+
c.username = ENV.fetch('SHIP_COMPLIANT_USER')
|
31
|
+
c.password = ENV.fetch('SHIP_COMPLIANT_PASS')
|
32
|
+
end
|
33
|
+
```
|
34
|
+
|
35
|
+
## Usage
|
36
|
+
|
37
|
+
TODO: Coming soon...
|
38
|
+
|
39
|
+
## Contributing
|
40
|
+
|
41
|
+
1. Fork it ( http://github.com/BaylorRae/ship_compliant-ruby/fork )
|
42
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
43
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
44
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
45
|
+
5. Create new Pull Request
|
46
|
+
|
47
|
+
[soap_wiki]: http://en.wikipedia.org/wiki/SOAP
|
48
|
+
[documentation_path]: http://baylorrae.github.io/ship_compliant-ruby/documentation/
|
49
|
+
[rdoc_path]: http://baylorrae.github.io/ship_compliant-ruby/rdoc/
|
50
|
+
[core_service_path]: https://shipcompliant.desk.com/customer/portal/articles/1451976-api-coreservice-v1-2?b_id=2759
|
data/Rakefile
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
|
3
|
+
require "rspec/core/rake_task"
|
4
|
+
|
5
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
6
|
+
t.verbose = false
|
7
|
+
t.ruby_opts = "-I./spec -rspec_helper"
|
8
|
+
t.rspec_opts = %w[--format progress]
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'cucumber/rake/task'
|
12
|
+
Cucumber::Rake::Task.new
|
13
|
+
|
14
|
+
task default: [:spec, :cucumber]
|
15
|
+
|
16
|
+
# SDoc command
|
17
|
+
# sdoc --main README.md lib README.md -o pages/rdoc --template=ship_complaint
|
18
|
+
require 'sdoc'
|
19
|
+
|
20
|
+
class RDoc::Generator::SDoc
|
21
|
+
protected
|
22
|
+
### Create class tree structure and write it as json
|
23
|
+
def generate_class_tree
|
24
|
+
my_topclasses = %W(SearchSalesOrders VoidSalesOrder AddUpdateProduct CheckCompliance CommitSalesOrder GetInventoryDetails GetSalesOrderExtended AddUpdateBrand)
|
25
|
+
|
26
|
+
debug_msg "Generating class tree"
|
27
|
+
topclasses = @classes.select do |klass|
|
28
|
+
!(!my_topclasses.include?(klass.name) && RDoc::ClassModule === klass.parent)
|
29
|
+
end
|
30
|
+
tree = generate_file_tree + generate_class_tree_level(topclasses)
|
31
|
+
debug_msg " writing class tree to %s" % TREE_FILE
|
32
|
+
File.open(TREE_FILE, "w", 0644) do |f|
|
33
|
+
f.write('var tree = '); f.write(tree.to_json(:max_nesting => 0))
|
34
|
+
end unless @options.dry_run
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
RDoc::Task.new('docs') do |rdoc|
|
39
|
+
rdoc.title = 'ShipCompliant API'
|
40
|
+
rdoc.template = 'ship_complaint'
|
41
|
+
rdoc.options << '--format' << 'sdoc'
|
42
|
+
rdoc.options << '--github'
|
43
|
+
|
44
|
+
rdoc.rdoc_dir = 'pages/rdoc'
|
45
|
+
rdoc.rdoc_files.include('lib/**/*.rb', 'README.md')
|
46
|
+
rdoc.main = 'README.md'
|
47
|
+
end
|
data/cucumber.yml
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
<%
|
2
|
+
rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
|
3
|
+
rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
|
4
|
+
std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} --strict --tags ~@wip"
|
5
|
+
%>
|
6
|
+
default: <%= std_opts %> features
|
7
|
+
wip: --tags @wip:3 --wip features
|
8
|
+
rerun: <%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip
|
9
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Feature: Add Update Brand
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I've added my credentials
|
5
|
+
|
6
|
+
Scenario: I add a new brand
|
7
|
+
When I add a new brand
|
8
|
+
Then the brand should have been created
|
9
|
+
|
10
|
+
Scenario: I add a brand that already exists
|
11
|
+
When I add a brand that already exists
|
12
|
+
Then I should get an error for already defined brand
|
13
|
+
|
14
|
+
Scenario: I update a brand that already exists
|
15
|
+
When I update an existing brand
|
16
|
+
Then the brand should have been updated
|
17
|
+
|
18
|
+
Scenario: I ignore an existing brand
|
19
|
+
When I ignore existing brand on update
|
20
|
+
Then the brand should have been updated
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Feature: Add Update Product
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I've added my credentials
|
5
|
+
|
6
|
+
Scenario: Add new product with missing Brand
|
7
|
+
When I add a new product with invalid brand
|
8
|
+
Then I should get an error message for the missing brand
|
9
|
+
|
10
|
+
Scenario: Add new product
|
11
|
+
When I add a new product
|
12
|
+
Then the product should have been created
|
13
|
+
|
14
|
+
Scenario: Add product that already exists
|
15
|
+
When I add a product that already exists
|
16
|
+
Then I should get an error for already defined product
|
17
|
+
|
18
|
+
Scenario: Update product that already exists
|
19
|
+
When I update a product
|
20
|
+
Then I should get a message that the product was updated
|
21
|
+
|
22
|
+
Scenario: Ignore existing product
|
23
|
+
When I ignore existing product on update
|
24
|
+
Then I should get a message that the product was updated
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Feature: Check Compliance Of SalesOrder With Address Validation
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I've added my credentials
|
5
|
+
|
6
|
+
Scenario: Check compliance with missing product
|
7
|
+
When I check compliance with a missing product
|
8
|
+
Then I should receive a product key error
|
9
|
+
|
10
|
+
Scenario: Check compliance with available product
|
11
|
+
When I check compliance with an available product
|
12
|
+
Then I should receive the sales tax rates
|
13
|
+
And I should receive the shipment compliance results
|
14
|
+
And I should receive the suggested address
|
15
|
+
|
16
|
+
Scenario: Check compliance with non-compliant product
|
17
|
+
When I check compliance with a non-compliant product
|
18
|
+
Then I should receive error messages
|
@@ -0,0 +1,15 @@
|
|
1
|
+
Feature: Get Sales Order Extended
|
2
|
+
|
3
|
+
Background:
|
4
|
+
Given I've added my credentials
|
5
|
+
|
6
|
+
Scenario: I search for order information
|
7
|
+
When I search for order information
|
8
|
+
Then I should receive shipment compliance statuses
|
9
|
+
And I should receive billing information
|
10
|
+
And I should receive shipment information
|
11
|
+
And I should receive order channel details
|
12
|
+
|
13
|
+
Scenario: I search for an order that doesn't exist
|
14
|
+
When I search for an invalid order
|
15
|
+
Then I should receive an error that the order doesn't exist
|
@@ -0,0 +1,13 @@
|
|
1
|
+
Feature: Search Sales Orders
|
2
|
+
|
3
|
+
Scenario: I search for orders by purchase date
|
4
|
+
Given I've added my credentials
|
5
|
+
When I search for orders by purchase date
|
6
|
+
Then I should find two orders
|
7
|
+
And I should receive a success status for search
|
8
|
+
And I should have paging cookie information
|
9
|
+
|
10
|
+
Scenario: I have an invalid search
|
11
|
+
Given I've added my credentials
|
12
|
+
When I search with invalid criteria
|
13
|
+
Then I should get an error status for search
|
@@ -0,0 +1,73 @@
|
|
1
|
+
When(/^I (create|update|ignore) a (?:new\s)?brand$/) do |action|
|
2
|
+
key = 'HCAS'
|
3
|
+
update_mode = 'ErrorOnExisting'
|
4
|
+
|
5
|
+
case action
|
6
|
+
when 'update'
|
7
|
+
key = 'HCAN'
|
8
|
+
update_mode = 'UpdateExisting'
|
9
|
+
when 'ignore'
|
10
|
+
update_mode = 'IgnoreExisting'
|
11
|
+
end
|
12
|
+
|
13
|
+
@brand_result = ShipCompliant::AddUpdateBrand.brand({
|
14
|
+
key: key,
|
15
|
+
name: 'Hiccups Anonymous',
|
16
|
+
owner: {
|
17
|
+
city: 'Ye Old Brew Port',
|
18
|
+
country: 'US',
|
19
|
+
name: 'John Doe',
|
20
|
+
state: 'LA',
|
21
|
+
street1: '1337 Drunken Ave.',
|
22
|
+
zip: 84742
|
23
|
+
},
|
24
|
+
|
25
|
+
this_brand_is_bottled_by_a_third_party: false,
|
26
|
+
this_brand_is_produced_by_a_third_party: false,
|
27
|
+
this_brand_operates_under_a_trade_name: true,
|
28
|
+
this_brand_was_acquired_from_a_third_party: false
|
29
|
+
}, update_mode: update_mode)
|
30
|
+
end
|
31
|
+
|
32
|
+
When(/^I add a new brand$/) do
|
33
|
+
VCR.use_cassette('brand_valid') do
|
34
|
+
step "I create a brand"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
When(/^I add a brand that already exists$/) do
|
39
|
+
VCR.use_cassette('brand_already_exists') do
|
40
|
+
step "I create a new brand"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
When(/^I update an existing brand$/) do
|
45
|
+
VCR.use_cassette('brand_update_existing') do
|
46
|
+
step "I update a brand"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
When(/^I ignore existing brand on update$/) do
|
51
|
+
VCR.use_cassette('brand_ignore_existing') do
|
52
|
+
step "I ignore a new brand"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
Then(/^I should get an error for already defined brand$/) do
|
57
|
+
@brand_result.failure?.should be_true
|
58
|
+
@brand_result.errors.length.should == 1
|
59
|
+
error = @brand_result.errors.first
|
60
|
+
|
61
|
+
error.code.should == 705
|
62
|
+
error.key.should == 'HCAS'
|
63
|
+
error.message.should == 'BrandKey exists.'
|
64
|
+
error.type.should == 'Validation'
|
65
|
+
end
|
66
|
+
|
67
|
+
Then(/^the brand should have been updated$/) do
|
68
|
+
@brand_result.success?.should be_true
|
69
|
+
end
|
70
|
+
|
71
|
+
Then(/^the brand should have been created$/) do
|
72
|
+
@brand_result.success?.should be_true
|
73
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
When(/^I commit a sale with all shipments$/) do
|
2
|
+
VCR.use_cassette('commit_salesorder_all_shipments') do
|
3
|
+
@order_commit_result = ShipCompliant::CommitSalesOrder.call({
|
4
|
+
commit_options: 'AllShipments',
|
5
|
+
payments: nil,
|
6
|
+
sales_tax_collected: 0,
|
7
|
+
sales_order_key: '1006932'
|
8
|
+
})
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
Then(/^I get a successful commit message$/) do
|
13
|
+
@order_commit_result.success?.should be_true
|
14
|
+
@order_commit_result.committed_shipments.should == ['1']
|
15
|
+
end
|
@@ -0,0 +1,175 @@
|
|
1
|
+
When(/^I check compliance with an available product$/) do
|
2
|
+
VCR.use_cassette('compliance_available_product') do
|
3
|
+
@compliance_status = ShipCompliant::CheckCompliance.of_sales_order({
|
4
|
+
address_option: {
|
5
|
+
ignore_street_level_errors: true,
|
6
|
+
reject_if_address_suggested: 'false'
|
7
|
+
},
|
8
|
+
include_sales_tax_rates: true,
|
9
|
+
persist_option: 'Null',
|
10
|
+
sales_order: {
|
11
|
+
bill_to: {
|
12
|
+
city: 'Boulder',
|
13
|
+
company: 'ShipCompliant',
|
14
|
+
country: 'US',
|
15
|
+
date_of_birth: DateTime.new(1987, 8, 6),
|
16
|
+
email: 'emiliy@six88.com',
|
17
|
+
first_name: 'Emily',
|
18
|
+
last_name: 'Sheehan',
|
19
|
+
phone: '303-996-1626',
|
20
|
+
state: 'CO',
|
21
|
+
street1: '1877 Broadway St',
|
22
|
+
street2: 'SUITE 703',
|
23
|
+
zip1: 80304
|
24
|
+
},
|
25
|
+
customer_key: 'd23c963b',
|
26
|
+
discounts: nil,
|
27
|
+
fulfillment_type: 'Daily',
|
28
|
+
order_type: 'Internet',
|
29
|
+
payments: nil,
|
30
|
+
purchase_date: DateTime.new(2014, 3, 12),
|
31
|
+
register_id: 'cf3ee9',
|
32
|
+
sales_order_key: '1006891',
|
33
|
+
sales_tax_collected: 0,
|
34
|
+
shipments: {
|
35
|
+
shipment: {
|
36
|
+
discounts: nil,
|
37
|
+
fulfillment_house: 'InHouse',
|
38
|
+
handling: 0,
|
39
|
+
insured_amount: 0,
|
40
|
+
license_relationship: 'Default',
|
41
|
+
packages: nil,
|
42
|
+
ship_date: DateTime.new(2014, 3, 15),
|
43
|
+
shipping_service: 'UPS',
|
44
|
+
shipment_items: [
|
45
|
+
{
|
46
|
+
shipment_item: {
|
47
|
+
brand_key: 'DEN',
|
48
|
+
discounts: nil,
|
49
|
+
product_key: '04CHRCAB75',
|
50
|
+
product_quantity: 6,
|
51
|
+
product_unit_price: 76
|
52
|
+
}
|
53
|
+
},
|
54
|
+
{
|
55
|
+
shipment_item: {
|
56
|
+
brand_key: 'DEN',
|
57
|
+
discounts: nil,
|
58
|
+
product_key: 'TShirt',
|
59
|
+
product_quantity: 1,
|
60
|
+
product_unit_price: 25.99
|
61
|
+
}
|
62
|
+
}
|
63
|
+
],
|
64
|
+
shipment_key: 1,
|
65
|
+
shipment_status: 'SentToFulfillment',
|
66
|
+
shipping: 15,
|
67
|
+
ship_to: {
|
68
|
+
city: 'New York',
|
69
|
+
company: nil,
|
70
|
+
country: 'US',
|
71
|
+
county: nil,
|
72
|
+
date_of_birth: DateTime.new(1987, 8, 6),
|
73
|
+
email: 'emily@six88.com',
|
74
|
+
fax: nil,
|
75
|
+
first_name: 'Emily',
|
76
|
+
last_name: 'Sheehan',
|
77
|
+
phone: '7209375005',
|
78
|
+
state: 'NY',
|
79
|
+
street1: '253 Broadway Ave',
|
80
|
+
street2: 'Floor 9',
|
81
|
+
zip1: 10007,
|
82
|
+
zip2: nil
|
83
|
+
}
|
84
|
+
}
|
85
|
+
},
|
86
|
+
tags: nil
|
87
|
+
}
|
88
|
+
})
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
Then(/^I should receive the sales tax rates$/) do
|
93
|
+
@compliance_status.success?.should be_true
|
94
|
+
@compliance_status.compliant?.should be_true
|
95
|
+
|
96
|
+
# Tax Rates
|
97
|
+
@compliance_status.recommended_tax_due.should == 44.1
|
98
|
+
@compliance_status.shipment_sales_tax_rates.should be_kind_of(Array)
|
99
|
+
shipment_taxes = @compliance_status.taxes_for_shipment('1')
|
100
|
+
|
101
|
+
# Freight Taxes
|
102
|
+
shipment_taxes.freight.sales_tax_due.should == 1.33125
|
103
|
+
shipment_taxes.freight.sales_tax_rate.should == 8.875
|
104
|
+
|
105
|
+
# Product Taxes
|
106
|
+
shipment_taxes.taxes_for_product('04CHRCAB75').sales_tax_due.should == 40.47
|
107
|
+
shipment_taxes.taxes_for_product('04CHRCAB75').sales_tax_rate.should == 8.875
|
108
|
+
|
109
|
+
shipment_taxes.taxes_for_product('TShirt').sales_tax_due.should == 2.30661
|
110
|
+
shipment_taxes.taxes_for_product('TShirt').sales_tax_rate.should == 8.875
|
111
|
+
end
|
112
|
+
|
113
|
+
Then(/^I should receive the shipment compliance results$/) do
|
114
|
+
shipment_compliance = @compliance_status.compliance_rules_for_shipment('1')
|
115
|
+
shipment_compliance.compliant?.should be_true
|
116
|
+
shipment_compliance.shipment_key.should == '1'
|
117
|
+
|
118
|
+
shipment_compliance.rules.length.should == 6
|
119
|
+
|
120
|
+
# Compliance Descriptions
|
121
|
+
compliance_descriptions = shipment_compliance.rules.map { |c| c.compliance_description }
|
122
|
+
compliance_descriptions.should == [
|
123
|
+
'No prohibited products in shipment.',
|
124
|
+
'You have 1 current license in this region for the time of this shipment.',
|
125
|
+
'Rule has been acknowledged.',
|
126
|
+
'Rule has been acknowledged.',
|
127
|
+
'All products within this shipment belong to self-produced brands.',
|
128
|
+
'You have shipped 1.00 cases to this individual between 1/1/2014 and 12/31/2014 and thus are under the customer aggregate volume limit of 36 cases per calendar year.'
|
129
|
+
]
|
130
|
+
|
131
|
+
# Rule Descriptions
|
132
|
+
rule_descriptions = shipment_compliance.rules.map { |c| c.rule_description }
|
133
|
+
rule_descriptions.should == [
|
134
|
+
'Some Products are always non-compliant.',
|
135
|
+
'A license is required for shipping offsite sales and must be renewed every 1 year. The cost of this license is $125.00.',
|
136
|
+
'Shipments to this region require an excise tax of $.30 per 1 gallon on offsite sales of wine less than or equal to 24% alcohol due within 20 days after every month. For a summary of the taxes in the state, click here.',
|
137
|
+
'Shipments to this region require sales tax for offsite sales shipments. For a summary of the taxes in the state, click here.',
|
138
|
+
'Only wines of your own production are allowed to be shipped to this region. Note: The license holder must produce the wine being shipped..',
|
139
|
+
'Shipments to this region have a per customer volume limit of 36 cases per individual per calendar year. The volume will be calculated from combined onsite and offsite sales.'
|
140
|
+
]
|
141
|
+
end
|
142
|
+
|
143
|
+
Then(/^I should receive the suggested address$/) do
|
144
|
+
@compliance_status.address_validation_result.should == 'ValidatedWithStreetLevelNormalization'
|
145
|
+
address = @compliance_status.suggested_address
|
146
|
+
|
147
|
+
address.city.should == 'New York'
|
148
|
+
address.county.should == 'New York'
|
149
|
+
address.state.should == 'NY'
|
150
|
+
address.street1.should == '253 Broadway'
|
151
|
+
address.street2.should == 'Fl 9'
|
152
|
+
address.zip1.should == 10007
|
153
|
+
address.zip2.should == 2326
|
154
|
+
|
155
|
+
address.details.should == {
|
156
|
+
city_abbreviation: 'New York',
|
157
|
+
congressional_district: '10',
|
158
|
+
county_fips: '36061',
|
159
|
+
time_zone: 'Eastern Time',
|
160
|
+
time_zone_code: '05'
|
161
|
+
}
|
162
|
+
|
163
|
+
address.parts.should == {
|
164
|
+
company: nil,
|
165
|
+
mail_box_name: nil,
|
166
|
+
mail_box_number: nil,
|
167
|
+
post_direction: nil,
|
168
|
+
pre_direction: nil,
|
169
|
+
street_name: 'Broadway',
|
170
|
+
street_number: '253',
|
171
|
+
street_suffix: nil,
|
172
|
+
suite_name: 'Fl',
|
173
|
+
suite_number: '9'
|
174
|
+
}
|
175
|
+
end
|