tax_cloud 0.1.4 → 0.2.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.
- data/.travis.yml +9 -0
- data/CHANGELOG.rdoc +28 -0
- data/CONTRIBUTORS.txt +20 -0
- data/Gemfile +1 -1
- data/LICENSE.rdoc +22 -0
- data/README.rdoc +112 -28
- data/Rakefile +10 -2
- data/lib/config/locales/en.yml +34 -0
- data/lib/hash.rb +8 -6
- data/lib/savon_soap_xml.rb +33 -0
- data/lib/tasks/tax_cloud.rake +20 -0
- data/lib/tasks/tax_code_groups.rake +39 -0
- data/lib/tasks/tax_codes.rake +45 -0
- data/lib/tax_cloud.rb +43 -16
- data/lib/tax_cloud/address.rb +30 -17
- data/lib/tax_cloud/cart_item.rb +13 -19
- data/lib/tax_cloud/client.rb +48 -0
- data/lib/tax_cloud/configuration.rb +17 -2
- data/lib/tax_cloud/errors.rb +6 -0
- data/lib/tax_cloud/errors/api_error.rb +18 -0
- data/lib/tax_cloud/errors/missing_config_error.rb +13 -0
- data/lib/tax_cloud/errors/missing_config_option_error.rb +19 -0
- data/lib/tax_cloud/errors/soap_error.rb +33 -0
- data/lib/tax_cloud/errors/tax_cloud_error.rb +86 -0
- data/lib/tax_cloud/errors/unexpected_soap_response_error.rb +23 -0
- data/lib/tax_cloud/record.rb +14 -0
- data/lib/tax_cloud/responses.rb +13 -0
- data/lib/tax_cloud/responses/authorized.rb +10 -0
- data/lib/tax_cloud/responses/authorized_with_capture.rb +10 -0
- data/lib/tax_cloud/responses/base.rb +88 -0
- data/lib/tax_cloud/responses/captured.rb +11 -0
- data/lib/tax_cloud/responses/cart_item.rb +24 -0
- data/lib/tax_cloud/responses/generic.rb +35 -0
- data/lib/tax_cloud/responses/lookup.rb +41 -0
- data/lib/tax_cloud/responses/ping.rb +10 -0
- data/lib/tax_cloud/responses/returned.rb +10 -0
- data/lib/tax_cloud/responses/tax_code_groups.rb +33 -0
- data/lib/tax_cloud/responses/tax_codes.rb +33 -0
- data/lib/tax_cloud/responses/tax_codes_by_group.rb +33 -0
- data/lib/tax_cloud/responses/verify_address.rb +29 -0
- data/lib/tax_cloud/tax_code.rb +11 -0
- data/lib/tax_cloud/tax_code_constants.rb +562 -0
- data/lib/tax_cloud/tax_code_group.rb +30 -0
- data/lib/tax_cloud/tax_code_group_constants.rb +31 -0
- data/lib/tax_cloud/tax_code_groups.rb +28 -0
- data/lib/tax_cloud/tax_codes.rb +24 -47
- data/lib/tax_cloud/transaction.rb +39 -34
- data/lib/tax_cloud/version.rb +3 -3
- data/tax_cloud.gemspec +7 -5
- data/test/cassettes/authorized.yml +70 -45
- data/test/cassettes/authorized_with_capture.yml +70 -45
- data/test/cassettes/captured.yml +101 -67
- data/test/cassettes/get_tic_groups.yml +656 -0
- data/test/cassettes/get_tics.yml +952 -0
- data/test/cassettes/get_tics_by_group.yml +49 -0
- data/test/cassettes/invalid_soap_call.yml +651 -0
- data/test/cassettes/lookup.yml +644 -25
- data/test/cassettes/lookup_ny.yml +651 -0
- data/test/cassettes/ping.yml +647 -0
- data/test/cassettes/ping_with_invalid_credentials.yml +647 -0
- data/test/cassettes/ping_with_invalid_response.yml +647 -0
- data/test/cassettes/returned.yml +101 -67
- data/test/cassettes/verify_bad_address.yml +578 -976
- data/test/cassettes/verify_good_address.yml +36 -23
- data/test/helper.rb +4 -19
- data/test/test_address.rb +25 -7
- data/test/test_client.rb +29 -0
- data/test/test_configuration.rb +33 -0
- data/test/test_setup.rb +18 -0
- data/test/test_soap.rb +13 -0
- data/test/test_tax_code_groups.rb +31 -0
- data/test/test_tax_codes.rb +19 -0
- data/test/test_transaction.rb +22 -11
- data/test/test_transaction_ny.rb +27 -0
- data/test/vcr_setup.rb +9 -0
- metadata +134 -24
- data/lib/savon_xml_override.rb +0 -30
data/.travis.yml
ADDED
data/CHANGELOG.rdoc
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
=== 0.2.0 (11/26/2012)
|
2
|
+
|
3
|
+
* The gem is now licensed under the MIT license - @dblock.
|
4
|
+
* Raise specialized configuration and SOAP errors - @dblock.
|
5
|
+
* Added <tt>TaxCloud::Client.ping</tt> - @dblock.
|
6
|
+
* Returning a verified <tt>TaxCloud::Address</tt> from <tt>TaxCloud::Address.verify</tt> - @dblock.
|
7
|
+
* Added <tt>TaxCloud::Address.zip</tt> that returns a 9-digit address zip code, when available - @dblock.
|
8
|
+
* Returning a <tt>TaxCloud::Responses::Lookup</tt> from <tt>TaxCloud::Transaction.lookup</tt> - @dblock.
|
9
|
+
* Returning transaction state, ie. <tt>"OK"</tt> from all other TaxCloud transactions. Exceptions are raised on error - @dblock.
|
10
|
+
* Added support for tax codes and tax code groups lookup with <tt>TaxCloud::TaxCodes</tt> and <tt>TaxCloud::TaxCode::Groups</tt> - @dblock.
|
11
|
+
|
12
|
+
=== 0.1.5 (5/9/2012)
|
13
|
+
|
14
|
+
* Fixed compatibility with Ruby 1.8.7 and 1.9.3, removed super from constructors for classes which inherit from <tt>Object</tt> - @gfmurphy.
|
15
|
+
|
16
|
+
=== 0.1.4 (10/20/2011)
|
17
|
+
|
18
|
+
* Upgraded rdoc - @drewtempelmeyer.
|
19
|
+
* Fixed <tt>.gemspec</tt> dependency declaration for savon - @drewtempelmeyer.
|
20
|
+
|
21
|
+
=== 0.1.3 (9/19/2011)
|
22
|
+
|
23
|
+
* Added support for the "returned" request - @danielmorrison.
|
24
|
+
* Refactoreted tests to use vcr and webmock - @danielmorrison.
|
25
|
+
|
26
|
+
=== 0.1.0 (8/23/2011)
|
27
|
+
|
28
|
+
* Initial public release - @drewtempelmeyer.
|
data/CONTRIBUTORS.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
tax_cloud Contributors
|
2
|
+
|
3
|
+
Lead Developers
|
4
|
+
=======================
|
5
|
+
* Drew Tempelmeyer
|
6
|
+
* Twitter: @tempelmeyer
|
7
|
+
* App.net: @tempelmeyer
|
8
|
+
* GitHub: drewtempelmeyer
|
9
|
+
|
10
|
+
* Daniel Doubrovkine
|
11
|
+
* Twitter: @dblockdotorg
|
12
|
+
* GitHub: dblock
|
13
|
+
|
14
|
+
Contributors
|
15
|
+
=======================
|
16
|
+
* Daniel Morrison
|
17
|
+
* GitHub: danielmorrison
|
18
|
+
|
19
|
+
* George F Murphy
|
20
|
+
* GitHub: gfmurphy
|
data/Gemfile
CHANGED
data/LICENSE.rdoc
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2011-2012 Drew Tempelmeyer & Contributors
|
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.rdoc
CHANGED
@@ -1,47 +1,126 @@
|
|
1
1
|
= TaxCloud
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
{<img src="https://travis-ci.org/drewtempelmeyer/tax_cloud.png" />}[https://travis-ci.org/drewtempelmeyer/tax_cloud]
|
4
|
+
|
5
|
+
TaxCloud[http://www.taxcloud.com] is a free service to calculate sales tax and generate tax reports. The <tt>tax_cloud</tt> gem allows you to easily integrate with TaxCloud's API.
|
6
|
+
|
7
|
+
=== Getting Started
|
8
|
+
A TaxCloud[http://www.taxcloud.com] API ID and API key are required, along with an optional USPS address API username.
|
9
|
+
|
10
|
+
1. Create a TaxCloud[http://www.taxcloud.com] merchant account at http://www.taxcloud.net.
|
11
|
+
2. Add a website to your TaxCloud[http://www.taxcloud.com] account. This will generate an API ID and API Key that you will need to use the service.
|
12
|
+
3. Get access to the USPS Address API at https://www.usps.com/business/webtools.htm. The API will provide a 9-digit zip code, which allows TaxCloud[http://www.taxcloud.com] to determine the most accurate rate.
|
5
13
|
|
6
14
|
=== Setup
|
7
|
-
Add the gem to your Gemfile
|
8
|
-
|
15
|
+
Add the gem to your Gemfile.
|
16
|
+
|
17
|
+
gem 'tax_cloud', '~> 0.1.5'
|
9
18
|
|
10
|
-
Configure your environment. For example, create an initializer in Rails in
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
19
|
+
Configure your environment. For example, create an initializer in Rails in <tt>config/initializers/tax_cloud.rb</tt>.
|
20
|
+
|
21
|
+
TaxCloud.configure do |config|
|
22
|
+
config.api_login_id = 'your_tax_cloud_api_login_id'
|
23
|
+
config.api_key = 'your_tax_cloud_api_key'
|
24
|
+
config.usps_username = 'your_usps_username'
|
25
|
+
end
|
16
26
|
|
17
27
|
=== Using TaxCloud
|
18
28
|
Define the destination and origin addresses using <tt>TaxCloud::Address</tt>.
|
19
|
-
|
20
|
-
|
29
|
+
|
30
|
+
origin = TaxCloud::Address.new(
|
31
|
+
:address1 => '162 East Avenue',
|
32
|
+
:address2 => 'Third Floor',
|
33
|
+
:city => 'Norwalk',
|
34
|
+
:state => 'CT',
|
35
|
+
:zip5 => '06851')
|
36
|
+
destination = TaxCloud::Address.new(
|
37
|
+
:address1 => '3121 West Government Way',
|
38
|
+
:address2 => 'Suite 2B',
|
39
|
+
:city => 'Seattle',
|
40
|
+
:state => 'WA',
|
41
|
+
:zip5 => '98199')
|
21
42
|
|
22
43
|
Create your Transaction and set up your cart items
|
23
|
-
|
24
|
-
|
25
|
-
|
44
|
+
|
45
|
+
transaction = TaxCloud::Transaction.new(
|
46
|
+
:customer_id => '1',
|
47
|
+
:cart_id => '1',
|
48
|
+
:origin => origin,
|
49
|
+
:destination => destination)
|
50
|
+
transaction.cart_items << TaxCloud::CartItem.new(
|
51
|
+
:index => 0,
|
52
|
+
:item_id => 'SKU-100',
|
53
|
+
:tic => TaxCloud::TaxCodes::GENERAL,
|
54
|
+
:price => 10.00,
|
55
|
+
:quantity => 1)
|
56
|
+
lookup = transaction.lookup # this will return a TaxCloud::Responses::Lookup instance
|
57
|
+
lookup.tax_amount # total tax amount
|
58
|
+
lookup.cart_items.each do |cart_item|
|
59
|
+
cart_item.tax_amount # tax for a single item
|
60
|
+
end
|
26
61
|
|
27
62
|
After you've authorized and captured the transaction via your merchant account, you should do the same with TaxCloud for maintaining accurate tax information.
|
28
|
-
transaction.order_id = 100
|
29
|
-
transaction.authorized_with_capture # return Savon response object
|
30
63
|
|
31
|
-
Later, you may need to mark some cart items as returned. TaxCloud will ignore any cart items that you don't include
|
32
64
|
transaction.order_id = 100
|
33
|
-
transaction.
|
34
|
-
transaction.returned # return Savon response object
|
65
|
+
transaction.authorized_with_capture # returns "OK" or raises an error
|
35
66
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
67
|
+
Later, you may need to mark some cart items as returned. TaxCloud will ignore any cart items that you don't include.
|
68
|
+
|
69
|
+
transaction.order_id = 100
|
70
|
+
transaction.cart_items << TaxCloud::CartItem.new(
|
71
|
+
:index => 0,
|
72
|
+
:item_id => 'SKU-100',
|
73
|
+
:tic => TaxCloud::TaxCodes::GENERAL,
|
74
|
+
:price => 10.00,
|
75
|
+
:quantity => 1)
|
76
|
+
transaction.returned # returns "OK" or raises an error
|
77
|
+
|
78
|
+
=== Verifying Addresses
|
79
|
+
|
80
|
+
TaxCloud[http://www.taxcloud.com] optionally integrates with the USPS Address API. An address can be verified, which can also yield a 9-digit zip code that helps determine a more accurate tax rate.
|
81
|
+
|
82
|
+
address = TaxCloud::Address.new({
|
83
|
+
:address1 => '888 6th Ave',
|
84
|
+
:city => 'New York',
|
85
|
+
:state => 'New York',
|
86
|
+
:zip5 => '10001'
|
87
|
+
})
|
41
88
|
|
42
|
-
|
43
|
-
|
44
|
-
|
89
|
+
verified_address = address.verify
|
90
|
+
verified_address.zip5 # 10001
|
91
|
+
verified_address.zip4 # 3502
|
92
|
+
verified_address.zip # 10001-3502
|
93
|
+
|
94
|
+
=== Tax Codes
|
95
|
+
TaxCloud[http://www.taxcloud.com] maintains a list of all Taxability Information Codes or TICs, which can be found at https://taxcloud.net/tic.
|
96
|
+
|
97
|
+
You can obtain all tax codes as well as lookup a tax code by ID.
|
98
|
+
|
99
|
+
TaxCloud::TaxCodes.all # a hash of all codes
|
100
|
+
tax_code = TaxCloud::TaxCodes[TaxCloud::TaxCodes::DIRECT_MAIL_RELATED]
|
101
|
+
tax_code.ticid # 11000 or TaxCloud::TaxCodes::DIRECT_MAIL_RELATED
|
102
|
+
tax_code.description # "Direct-mail related"
|
103
|
+
|
104
|
+
Tax codes are organized in groups.
|
105
|
+
|
106
|
+
TaxCloud::TaxCode::Groups.all # a hash of all groups
|
107
|
+
tax_code_group = TaxCloud::TaxCode::Groups[TaxCloud::TaxCode::Groups::SCHOOL_RELATED_PRODUCTS]
|
108
|
+
tax_code_group.group_id # 3 or TaxCloud::TaxCode::Groups::SCHOOL_RELATED_PRODUCTS
|
109
|
+
tax_code_group.description # School Related Products
|
110
|
+
tax_code_group.tax_codes # a hash of all codes in this group
|
111
|
+
|
112
|
+
Tax code constants are defined in <tt>tax_code_constants.rb</tt> and tax code group constants in <tt>tax_code_group_constants.rb</tt>. These files can be generated by running the following rake tasks.
|
113
|
+
|
114
|
+
TAXCLOUD_API_LOGIN_ID=... TAXCLOUD_API_KEY=... TAXCLOUD_USPS_USERNAME=... tax_cloud:tax_codes
|
115
|
+
TAXCLOUD_API_LOGIN_ID=... TAXCLOUD_API_KEY=... TAXCLOUD_USPS_USERNAME=... tax_cloud:tax_code_groups
|
116
|
+
|
117
|
+
=== Running Tests
|
118
|
+
* VCR and WebMock are used to replay requests and avoid hitting the API each time. To refresh the mocks, simply delete the <tt>test/cassettes</tt> directory.
|
119
|
+
* Run tests.
|
120
|
+
rake test
|
121
|
+
* If you need to record new requests against TaxCloud, set your keys first.
|
122
|
+
TAXCLOUD_API_LOGIN_ID=... TAXCLOUD_API_KEY=... TAXCLOUD_USPS_USERNAME=... rake test
|
123
|
+
The mocks will filter out your configuration details.
|
45
124
|
|
46
125
|
=== Bugs, fixes, etc
|
47
126
|
* Fork.
|
@@ -49,3 +128,8 @@ Later, you may need to mark some cart items as returned. TaxCloud will ignore an
|
|
49
128
|
* Fix.
|
50
129
|
* Commit.
|
51
130
|
* Submit pull request.
|
131
|
+
|
132
|
+
=== License
|
133
|
+
|
134
|
+
This gem is licened under the MIT license.
|
135
|
+
|
data/Rakefile
CHANGED
@@ -13,12 +13,20 @@ end
|
|
13
13
|
RDoc::Task.new do |rd|
|
14
14
|
README = 'README.rdoc'
|
15
15
|
rd.main = README
|
16
|
-
rd.rdoc_files.include(README, "lib/**/*.rb")
|
16
|
+
rd.rdoc_files.include(README, 'CHANGELOG.rdoc', 'LICENSE.rdoc', "lib/**/*.rb")
|
17
17
|
rd.rdoc_dir = 'doc'
|
18
18
|
rd.title = 'tax_cloud'
|
19
19
|
end
|
20
20
|
|
21
|
-
desc "Validate the gemspec"
|
21
|
+
desc "Validate the gemspec."
|
22
22
|
task :gemspec do
|
23
23
|
puts gemspec.validate
|
24
24
|
end
|
25
|
+
|
26
|
+
load 'lib/tasks/tax_cloud.rake'
|
27
|
+
load 'lib/tasks/tax_codes.rake'
|
28
|
+
load 'lib/tasks/tax_code_groups.rake'
|
29
|
+
|
30
|
+
load 'vcr/tasks/vcr.rake'
|
31
|
+
|
32
|
+
task :default => :test
|
@@ -0,0 +1,34 @@
|
|
1
|
+
en:
|
2
|
+
taxcloud:
|
3
|
+
errors:
|
4
|
+
messages:
|
5
|
+
missing_config:
|
6
|
+
message: "Missing configuration."
|
7
|
+
summary: "TaxCloud requires an API login ID and key."
|
8
|
+
resolution: "Create a TaxCloud merchant account at http://www.taxcloud.net.
|
9
|
+
Add a website to your TaxCloud account. This will generate an API ID and
|
10
|
+
API Key that you will need to use the service. Configure the TaxCloud
|
11
|
+
gem. For example, add the following to `config/initializers/tax_cloud.rb`.\n
|
12
|
+
\_\_TaxCloud.configure do |config|\n
|
13
|
+
\_\_\_config.api_login_id = 'your_tax_cloud_api_login_id'\n
|
14
|
+
\_\_\_config.api_key = 'your_tax_cloud_api_key'\n
|
15
|
+
\_\_\_config.usps_username = 'your_usps_username' # optional\n
|
16
|
+
\_\_end\n"
|
17
|
+
missing_config_option:
|
18
|
+
message: "Missing configuration option: %{name}."
|
19
|
+
summary: "A configuration option was not provided when configuration TaxCloud."
|
20
|
+
resolution: "Review your `TaxCloud.configure` code. Are you using an environment
|
21
|
+
variable that has not been set?"
|
22
|
+
soap_error:
|
23
|
+
message: "%{message}"
|
24
|
+
summary: "The server returned a %{code} error."
|
25
|
+
resolution: "Review the parameters passed to the request."
|
26
|
+
unexpected_soap_response:
|
27
|
+
message: "Expected a value for `%{key}` in `%{chain}` in the TaxCloud response."
|
28
|
+
summary: "TaxCloud returned an unexpected response: `%{raw}`."
|
29
|
+
resolution: "This is possibly a bug in the tax_cloud gem.\n
|
30
|
+
Please report it in https://github.com/drewtempelmeyer/tax_cloud/issues."
|
31
|
+
api_error:
|
32
|
+
message: "%{message}"
|
33
|
+
summary: "The TaxCloud server returned an error in the response: `%{raw}`"
|
34
|
+
resolution: "Check the request parameters."
|
data/lib/hash.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
-
class Hash
|
1
|
+
class Hash #:nodoc: all
|
2
|
+
|
2
3
|
# Downcase the keys. Use this because <tt>TaxCloud::Address.verify</tt> requires downcased keys
|
3
|
-
def downcase_keys
|
4
|
-
|
5
|
-
|
4
|
+
def downcase_keys
|
5
|
+
inject({}) do |h, (k, v)|
|
6
|
+
h[k.downcase] = v
|
7
|
+
h
|
6
8
|
end
|
7
|
-
self
|
8
9
|
end
|
9
|
-
|
10
|
+
|
11
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Hack Savon to work properly with arrays
|
2
|
+
module Savon #:nodoc:
|
3
|
+
module SOAP #:nodoc:
|
4
|
+
class XML #:nodoc:
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
old_add_namespaces_to_body = self.instance_method(:add_namespaces_to_body)
|
9
|
+
|
10
|
+
def add_namespaces_to_body(hash, path = [input[1].to_s])
|
11
|
+
return unless hash
|
12
|
+
return hash if hash.kind_of? Array
|
13
|
+
return hash.to_s unless hash.kind_of? Hash
|
14
|
+
|
15
|
+
hash.inject({}) do |newhash, (key, value)|
|
16
|
+
camelcased_key = Gyoku::XMLKey.create(key)
|
17
|
+
newpath = path + [camelcased_key]
|
18
|
+
|
19
|
+
if used_namespaces[newpath]
|
20
|
+
newhash.merge(
|
21
|
+
"#{used_namespaces[newpath]}:#{camelcased_key}" =>
|
22
|
+
add_namespaces_to_body(value, types[newpath] ? [types[newpath]] : newpath)
|
23
|
+
)
|
24
|
+
else
|
25
|
+
newhash.merge(key => value)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'tax_cloud'
|
2
|
+
|
3
|
+
namespace :tax_cloud do
|
4
|
+
|
5
|
+
desc "Configure TaxCloud."
|
6
|
+
task :configure do
|
7
|
+
unless TaxCloud.configured?
|
8
|
+
TaxCloud.configure do |config|
|
9
|
+
config.api_login_id = ENV['TAXCLOUD_API_LOGIN_ID']
|
10
|
+
config.api_key = ENV['TAXCLOUD_API_KEY']
|
11
|
+
config.usps_username = ENV['TAXCLOUD_USPS_USERNAME']
|
12
|
+
end
|
13
|
+
Savon.configure do |config|
|
14
|
+
config.log = false
|
15
|
+
end
|
16
|
+
HTTPI.log = false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
namespace :tax_cloud do
|
2
|
+
|
3
|
+
desc "Generate tax code groups."
|
4
|
+
task :tax_code_groups => :configure do
|
5
|
+
filename = "lib/tax_cloud/tax_code_group_constants.rb"
|
6
|
+
|
7
|
+
begin
|
8
|
+
groups = TaxCloud::TaxCode::Groups.all.values
|
9
|
+
|
10
|
+
File.open filename, "wt" do |f|
|
11
|
+
f.write "module TaxCloud\n"
|
12
|
+
f.write " class TaxCode\n"
|
13
|
+
f.write " # Tax Code Groups.\n"
|
14
|
+
f.write " class Groups\n"
|
15
|
+
|
16
|
+
groups.each do |group|
|
17
|
+
puts " #{group.description}"
|
18
|
+
code = group.description.upcase
|
19
|
+
code.gsub! /[^A-Z0-9]/, '_'
|
20
|
+
code.gsub! /_$/, ''
|
21
|
+
code.gsub! /\_+/, '_'
|
22
|
+
f.write " \# #{group.description}\n"
|
23
|
+
f.write " #{code} = #{group.group_id}\n"
|
24
|
+
end
|
25
|
+
|
26
|
+
f.write " end\n"
|
27
|
+
f.write " end\n"
|
28
|
+
f.write "end\n"
|
29
|
+
end
|
30
|
+
|
31
|
+
puts "Done, #{filename}."
|
32
|
+
rescue => e
|
33
|
+
puts "ERROR: Unable to generate a new list of tax codes."
|
34
|
+
puts e.message
|
35
|
+
raise e
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
namespace :tax_cloud do
|
2
|
+
|
3
|
+
desc "Generate tax codes."
|
4
|
+
task :tax_codes => :configure do
|
5
|
+
filename = "lib/tax_cloud/tax_code_constants.rb"
|
6
|
+
|
7
|
+
begin
|
8
|
+
groups = TaxCloud::TaxCode::Groups.all.values
|
9
|
+
groups_and_tax_codes = Hash[groups.map do |group|
|
10
|
+
[ group, group.tax_codes.values ]
|
11
|
+
end]
|
12
|
+
File.open filename, "wt" do |f|
|
13
|
+
f.write "module TaxCloud\n"
|
14
|
+
f.write " # Tax Codes.\n"
|
15
|
+
f.write " class TaxCodes\n"
|
16
|
+
f.write "\n"
|
17
|
+
codes = {}
|
18
|
+
groups_and_tax_codes.each_pair do |group, tax_codes|
|
19
|
+
puts " #{group.description}"
|
20
|
+
f.write " \# #{group.description}\n\n"
|
21
|
+
tax_codes.each do |tax_code|
|
22
|
+
code = tax_code.description.upcase
|
23
|
+
code.gsub! /[^A-Z0-9]/, '_'
|
24
|
+
code.gsub! /\_+$/, ''
|
25
|
+
code.gsub! /\_+/, '_'
|
26
|
+
# avoid duplicates
|
27
|
+
code_id = codes[code] ? "#{code}_#{codes[code]}" : code
|
28
|
+
codes[code] = (codes[code] || 0) + 1
|
29
|
+
f.write " \# #{group.description}: #{tax_code.description}\n"
|
30
|
+
f.write " #{code_id} = #{tax_code.ticid}\n"
|
31
|
+
end
|
32
|
+
f.write "\n"
|
33
|
+
end
|
34
|
+
f.write " end\n"
|
35
|
+
f.write "end\n"
|
36
|
+
end
|
37
|
+
puts "Done, #{filename}."
|
38
|
+
rescue => e
|
39
|
+
puts "ERROR: Unable to generate a new list of tax codes."
|
40
|
+
puts e.message
|
41
|
+
raise e
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|