workarea-avatax 4.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.
- checksums.yaml +7 -0
- data/.editorconfig +20 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
- data/.github/ISSUE_TEMPLATE/documentation-request.md +17 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- data/.github/workflows/ci.yml +66 -0
- data/.gitignore +18 -0
- data/.rubocop.yml +8 -0
- data/CHANGELOG.md +123 -0
- data/CODE_OF_CONDUCT.md +3 -0
- data/CONTRIBUTING.md +3 -0
- data/Gemfile +10 -0
- data/LICENSE.md +3 -0
- data/README.md +57 -0
- data/Rakefile +50 -0
- data/app/models/workarea/avatax/usage_type.rb +17 -0
- data/app/models/workarea/pricing/calculators/avalara_tax_calculator.rb +105 -0
- data/app/models/workarea/user.decorator +7 -0
- data/app/seeds/workarea/avatax_seeds.rb +44 -0
- data/app/view_models/workarea/admin/user_view_model.decorator +21 -0
- data/app/view_models/workarea/storefront/cart_view_model.decorator +7 -0
- data/app/views/workarea/admin/users/_avatax_properties_fields.html.haml +5 -0
- data/app/workers/workarea/avatax/tax_invoice_worker.rb +29 -0
- data/bin/rails +17 -0
- data/config/initializers/appends.rb +4 -0
- data/config/initializers/avatax.rb +14 -0
- data/config/initializers/seeds.rb +1 -0
- data/config/locales/en.yml +6 -0
- data/lib/avatax/api.decorator +52 -0
- data/lib/workarea/avatax/bogus_gateway/bogus_create_transaction.rb +187 -0
- data/lib/workarea/avatax/bogus_gateway.rb +34 -0
- data/lib/workarea/avatax/engine.rb +36 -0
- data/lib/workarea/avatax/tax_request/addresses.rb +35 -0
- data/lib/workarea/avatax/tax_request/line_item.rb +47 -0
- data/lib/workarea/avatax/tax_request/order_line_item.rb +64 -0
- data/lib/workarea/avatax/tax_request/order_lines.rb +70 -0
- data/lib/workarea/avatax/tax_request/response.rb +49 -0
- data/lib/workarea/avatax/tax_request/shipping_line_item.rb +34 -0
- data/lib/workarea/avatax/tax_request.rb +77 -0
- data/lib/workarea/avatax/version.rb +5 -0
- data/lib/workarea/avatax.rb +71 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +34 -0
- data/test/dummy/bin/update +29 -0
- data/test/dummy/config/application.rb +23 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/cable.yml +9 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +54 -0
- data/test/dummy/config/environments/production.rb +86 -0
- data/test/dummy/config/environments/test.rb +44 -0
- data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/new_framework_defaults.rb +23 -0
- data/test/dummy/config/initializers/workarea.rb +5 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/puma.rb +47 -0
- data/test/dummy/config/routes.rb +5 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config/spring.rb +6 -0
- data/test/dummy/config.ru +5 -0
- data/test/dummy/db/seeds.rb +2 -0
- data/test/dummy/lib/assets/.keep +0 -0
- data/test/dummy/log/.keep +0 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/test/dummy/public/apple-touch-icon.png +0 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/factories/workarea/avatax_factories.rb +142 -0
- data/test/lib/workarea/avatax/tax_request/order_line_items_test.rb +114 -0
- data/test/lib/workarea/avatax/tax_request/response_test.rb +42 -0
- data/test/lib/workarea/avatax/tax_request_test.rb +51 -0
- data/test/lib/workarea/avatax_test.rb +28 -0
- data/test/models/workarea/avatax/usage_type_test.rb +13 -0
- data/test/models/workarea/pricing/calculators/avalara_tax_calculator_test.rb +113 -0
- data/test/support/avatax_test_settings.rb +9 -0
- data/test/system/workarea/storefront/avatax_system_test.rb +22 -0
- data/test/test_helper.rb +20 -0
- data/test/vcr_cassettes/succesful_avatax_create_transaction.yml +60 -0
- data/test/vcr_cassettes/succesful_avatax_create_transaction_multiple_shippings.yml +76 -0
- data/workarea-avatax.gemspec +20 -0
- metadata +176 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 154de54ee351747a48c10892cc8ae997fea1584ccc63388295ad304ff35e195e
|
4
|
+
data.tar.gz: 3a06052d7b64aebabc4648482c553ce0b4012a2db1533ec19bf691425477c377
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 6b4e6f1e88d2d040c60b3f0b30b020bb31918fa02ad956ca80b58a9a663e30eaac0ab594f6a60a256ccce531e1710b63818b2d0b1696ce852eae16bde60e7dfb
|
7
|
+
data.tar.gz: 59a9e7d21976bd0b47e5b3c2d2345c89a793e780981a1ee548715bf173145dbf68d9cabc0775630b47b0cf910f3fb278fb2950144225d9ad202c41684b45adfa
|
data/.editorconfig
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# editorconfig.org
|
2
|
+
root = true
|
3
|
+
|
4
|
+
[*]
|
5
|
+
charset = utf-8
|
6
|
+
indent_style = space
|
7
|
+
end_of_line = lf
|
8
|
+
trim_trailing_whitespace = true
|
9
|
+
insert_final_newline = true
|
10
|
+
|
11
|
+
[{*.rb,*.haml,*.decorator,*.yml,*.yaml,*.jbuilder}]
|
12
|
+
indent_size = 2
|
13
|
+
indent_style = space
|
14
|
+
|
15
|
+
[{*.js,*.jst,*.ejs,*.scss}]
|
16
|
+
indent_size = 4
|
17
|
+
|
18
|
+
[*.md]
|
19
|
+
indent_size = 4
|
20
|
+
trim_trailing_whitespace = false
|
@@ -0,0 +1,37 @@
|
|
1
|
+
---
|
2
|
+
name: Bug report
|
3
|
+
about: Create a report to help us improve Workarea
|
4
|
+
title: ''
|
5
|
+
labels: bug
|
6
|
+
assignees: ''
|
7
|
+
|
8
|
+
---
|
9
|
+
|
10
|
+
⚠️**Before you create**⚠️
|
11
|
+
Please verify the issue you're experiencing is not part of your Workarea project customizations. The best way to do this is with a [vanilla Workarea installation](https://developer.workarea.com/articles/create-a-new-host-application.html). This will help us spend time on fixes/improvements for the whole community. Thank you!
|
12
|
+
|
13
|
+
**Describe the bug**
|
14
|
+
A clear and concise description of what the bug is.
|
15
|
+
|
16
|
+
**To Reproduce**
|
17
|
+
Steps to reproduce the behavior:
|
18
|
+
1. Go to '...'
|
19
|
+
2. Click on '....'
|
20
|
+
3. Scroll down to '....'
|
21
|
+
4. See error
|
22
|
+
|
23
|
+
**Expected behavior**
|
24
|
+
A clear and concise description of what you expected to happen.
|
25
|
+
|
26
|
+
**Workarea Setup (please complete the following information):**
|
27
|
+
- Workarea Version: [e.g. v3.4.6]
|
28
|
+
- Plugins [e.g. workarea-blog, workarea-sitemaps]
|
29
|
+
|
30
|
+
**Attachments**
|
31
|
+
If applicable, add any attachments to help explain your problem, things like:
|
32
|
+
- screenshots
|
33
|
+
- Gemfile.lock
|
34
|
+
- test cases
|
35
|
+
|
36
|
+
**Additional context**
|
37
|
+
Add any other context about the problem here.
|
@@ -0,0 +1,17 @@
|
|
1
|
+
---
|
2
|
+
name: Documentation request
|
3
|
+
about: Suggest documentation
|
4
|
+
title: ''
|
5
|
+
labels: documentation
|
6
|
+
assignees: ''
|
7
|
+
|
8
|
+
---
|
9
|
+
|
10
|
+
**Is your documentation related to a problem? Please describe.**
|
11
|
+
A clear and concise description of what the problem is. Ex. I'm confused by [...]
|
12
|
+
|
13
|
+
**Describe the article you'd like**
|
14
|
+
A clear and concise description of what would be in the documentation article.
|
15
|
+
|
16
|
+
**Additional context**
|
17
|
+
Add any other context or screenshots about the feature request here.
|
@@ -0,0 +1,20 @@
|
|
1
|
+
---
|
2
|
+
name: Feature request
|
3
|
+
about: Suggest an idea for Workarea
|
4
|
+
title: ''
|
5
|
+
labels: enhancement
|
6
|
+
assignees: ''
|
7
|
+
|
8
|
+
---
|
9
|
+
|
10
|
+
**Is your feature request related to a problem? Please describe.**
|
11
|
+
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
12
|
+
|
13
|
+
**Describe the solution you'd like**
|
14
|
+
A clear and concise description of what you want to happen.
|
15
|
+
|
16
|
+
**Describe alternatives you've considered**
|
17
|
+
A clear and concise description of any alternative solutions or features you've considered.
|
18
|
+
|
19
|
+
**Additional context**
|
20
|
+
Add any other context or screenshots about the feature request here.
|
@@ -0,0 +1,66 @@
|
|
1
|
+
name: CI
|
2
|
+
on: [push]
|
3
|
+
|
4
|
+
jobs:
|
5
|
+
static_analysis:
|
6
|
+
runs-on: ubuntu-latest
|
7
|
+
steps:
|
8
|
+
- uses: actions/checkout@v1
|
9
|
+
- uses: workarea-commerce/ci/bundler-audit@v1
|
10
|
+
env:
|
11
|
+
GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_ACCESS_TOKEN }}
|
12
|
+
- uses: workarea-commerce/ci/rubocop@v1
|
13
|
+
env:
|
14
|
+
GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_ACCESS_TOKEN }}
|
15
|
+
|
16
|
+
admin_tests:
|
17
|
+
runs-on: ubuntu-latest
|
18
|
+
steps:
|
19
|
+
- uses: actions/checkout@v1
|
20
|
+
- uses: actions/setup-ruby@v1
|
21
|
+
with:
|
22
|
+
ruby-version: 2.6.x
|
23
|
+
- uses: workarea-commerce/ci/test@v1
|
24
|
+
with:
|
25
|
+
command: bin/rails app:workarea:test:admin
|
26
|
+
env:
|
27
|
+
GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_ACCESS_TOKEN }}
|
28
|
+
|
29
|
+
core_tests:
|
30
|
+
runs-on: ubuntu-latest
|
31
|
+
steps:
|
32
|
+
- uses: actions/checkout@v1
|
33
|
+
- uses: actions/setup-ruby@v1
|
34
|
+
with:
|
35
|
+
ruby-version: 2.6.x
|
36
|
+
- uses: workarea-commerce/ci/test@v1
|
37
|
+
with:
|
38
|
+
command: bin/rails app:workarea:test:core
|
39
|
+
env:
|
40
|
+
GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_ACCESS_TOKEN }}
|
41
|
+
|
42
|
+
storefront_tests:
|
43
|
+
runs-on: ubuntu-latest
|
44
|
+
steps:
|
45
|
+
- uses: actions/checkout@v1
|
46
|
+
- uses: actions/setup-ruby@v1
|
47
|
+
with:
|
48
|
+
ruby-version: 2.6.x
|
49
|
+
- uses: workarea-commerce/ci/test@v1
|
50
|
+
with:
|
51
|
+
command: bin/rails app:workarea:test:storefront
|
52
|
+
env:
|
53
|
+
GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_ACCESS_TOKEN }}
|
54
|
+
|
55
|
+
plugins_tests:
|
56
|
+
runs-on: ubuntu-latest
|
57
|
+
steps:
|
58
|
+
- uses: actions/checkout@v1
|
59
|
+
- uses: actions/setup-ruby@v1
|
60
|
+
with:
|
61
|
+
ruby-version: 2.6.x
|
62
|
+
- uses: workarea-commerce/ci/test@v1
|
63
|
+
with:
|
64
|
+
command: bin/rails app:workarea:test:plugins
|
65
|
+
env:
|
66
|
+
GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_ACCESS_TOKEN }}
|
data/.gitignore
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
.bundle/
|
2
|
+
log/*.log
|
3
|
+
pkg/
|
4
|
+
spec/dummy/db/*.sqlite3
|
5
|
+
spec/dummy/db/*.sqlite3-journal
|
6
|
+
spec/dummy/log/*.log
|
7
|
+
spec/dummy/tmp/
|
8
|
+
spec/dummy/.sass-cache
|
9
|
+
test/dummy/db/*.sqlite3
|
10
|
+
test/dummy/db/*.sqlite3-journal
|
11
|
+
test/dummy/log/*.log
|
12
|
+
test/dummy/tmp/
|
13
|
+
test/dummy/.sass-cache
|
14
|
+
test/dummy/public/system/workarea
|
15
|
+
Gemfile.lock
|
16
|
+
coverage
|
17
|
+
.DS_Store
|
18
|
+
.byebug_history
|
data/.rubocop.yml
ADDED
data/CHANGELOG.md
ADDED
@@ -0,0 +1,123 @@
|
|
1
|
+
Workarea Avatax 4.2.0 (2019-11-26)
|
2
|
+
--------------------------------------------------------------------------------
|
3
|
+
|
4
|
+
* Support tax on non-shipping items
|
5
|
+
|
6
|
+
Since v3.5 supports non-shipping items natively, this checks those to
|
7
|
+
assign taxes from Avalara.
|
8
|
+
Ben Crouse
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
Workarea Avatax 4.1.2 (2019-09-17)
|
13
|
+
--------------------------------------------------------------------------------
|
14
|
+
|
15
|
+
* Fix when to display taxes in cart
|
16
|
+
|
17
|
+
Display taxes in cart if they have already been calculated.
|
18
|
+
|
19
|
+
AVATAX-38
|
20
|
+
Eric Pigeon
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
Workarea Avatax 4.1.1 (2019-07-23)
|
25
|
+
--------------------------------------------------------------------------------
|
26
|
+
|
27
|
+
* Pass addresses on order line items in tax request
|
28
|
+
|
29
|
+
Pass the addresses.shipTo adress on order line items when using the
|
30
|
+
split shipping plugin
|
31
|
+
|
32
|
+
AVATAX-34
|
33
|
+
Eric Pigeon
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
Workarea Avatax 4.1.0 (2018-12-20)
|
38
|
+
--------------------------------------------------------------------------------
|
39
|
+
|
40
|
+
* Add support for partial shippings
|
41
|
+
|
42
|
+
Update the tax request to split up order line items by
|
43
|
+
`Workarea::Shipping#quantities` for orders with multiple shippings
|
44
|
+
|
45
|
+
AVATAX-30
|
46
|
+
Eric Pigeon
|
47
|
+
|
48
|
+
|
49
|
+
|
50
|
+
Workarea Avatax 4.0.1 (2018-04-24)
|
51
|
+
--------------------------------------------------------------------------------
|
52
|
+
|
53
|
+
* Update seeds for Educational org
|
54
|
+
|
55
|
+
AVATAX-28
|
56
|
+
Eric Pigeon
|
57
|
+
|
58
|
+
|
59
|
+
Workarea Avatax 4.0.0 (2018-02-20)
|
60
|
+
--------------------------------------------------------------------------------
|
61
|
+
|
62
|
+
* Remove vendored AvaTax code, use gem from RubyGems
|
63
|
+
|
64
|
+
This had the potential to cause some issues when combining usage of the
|
65
|
+
workarea-avatax plugin with that of the workarea-address_verification
|
66
|
+
plugin.
|
67
|
+
|
68
|
+
AVATAX-27
|
69
|
+
Tom Scott
|
70
|
+
|
71
|
+
* Add timeout during pricing calculator
|
72
|
+
|
73
|
+
update vendored avatax gem files
|
74
|
+
add company code to request
|
75
|
+
|
76
|
+
AVATAX-25
|
77
|
+
Eric Pigeon
|
78
|
+
|
79
|
+
|
80
|
+
Workarea Avatax 3.0.1 (2017-09-06)
|
81
|
+
--------------------------------------------------------------------------------
|
82
|
+
|
83
|
+
* Update vendored version of avatax gem
|
84
|
+
|
85
|
+
Update vendored avatax gem. there's still some problems preventing use
|
86
|
+
of the cut version, notable it returning hashie mash responses instead
|
87
|
+
of faraday responses. memoize .resposne on a tax request to stop it
|
88
|
+
from creating a transaction everytime the response is accessed.
|
89
|
+
|
90
|
+
AVATAX-22
|
91
|
+
Eric Pigeon
|
92
|
+
|
93
|
+
* Fix bugs with commiting a tax transaction.
|
94
|
+
|
95
|
+
Commit fixes to tax worker to use correct symbolized keys on transaction.
|
96
|
+
fix bug with improper response reference on the invoice worker
|
97
|
+
|
98
|
+
AVATAX-22
|
99
|
+
Jeff Yucis
|
100
|
+
|
101
|
+
|
102
|
+
Workarea Avatax 3.0.0 (2017-07-06)
|
103
|
+
--------------------------------------------------------------------------------
|
104
|
+
|
105
|
+
* Update configuration and readme
|
106
|
+
|
107
|
+
Allow the endpoint to be set via secrets so apps and easily configure
|
108
|
+
their staging environments. Fix error sending money object instead of
|
109
|
+
string in rest call. Add timeout to faraday
|
110
|
+
|
111
|
+
AVATAX-20
|
112
|
+
Eric Pigeon
|
113
|
+
|
114
|
+
* Upgrade avatax for Workarea v3
|
115
|
+
|
116
|
+
Upgrade the avatax to use the newer version 2 rest api. They haven't
|
117
|
+
publicly released them gem so it's currently vendored into lib/avatax.
|
118
|
+
Update the tax calculator to build from price adjustments on the order
|
119
|
+
and store tax adjustments on the shipping to mirror how it works in
|
120
|
+
version 3.
|
121
|
+
|
122
|
+
AVATAX-20
|
123
|
+
Eric Pigeon
|
data/CODE_OF_CONDUCT.md
ADDED
data/CONTRIBUTING.md
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
source "https://rubygems.org"
|
2
|
+
|
3
|
+
gemspec
|
4
|
+
|
5
|
+
gem 'workarea', git: 'https://github.com/workarea-commerce/workarea.git'
|
6
|
+
gem 'workarea-oms', git: "https://x-access-token:#{ENV['GITHUB_ACCESS_TOKEN']}@github.com/workarea-commerce/workarea-oms.git"
|
7
|
+
|
8
|
+
group :test do
|
9
|
+
gem "simplecov"
|
10
|
+
end
|
data/LICENSE.md
ADDED
data/README.md
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# Avatax
|
2
|
+
|
3
|
+
Avatax by Avalara provides a centralized service for tracking sales tax bills.
|
4
|
+
This plugin integrates that service into the Workarea platform. Instead of using
|
5
|
+
the Workarea platform's included sales tax caclulation system, it uses Avatax to
|
6
|
+
calculate sales tax. After an order is placed, that order's sales tax bill is
|
7
|
+
transmitted to Avatax. Users may choose to commit (save them so that they are
|
8
|
+
reflected in tax liability) posted documents either via Workarea platform, or
|
9
|
+
via their own order management system.
|
10
|
+
|
11
|
+
## Features
|
12
|
+
|
13
|
+
### Out of the Box
|
14
|
+
|
15
|
+
* Full reporting feature with summarized and detailed reports
|
16
|
+
* Constant real time updates with the latest rules and regulations for accuracy
|
17
|
+
|
18
|
+
## Requirements
|
19
|
+
|
20
|
+
* Avalara Avatax account (These values can be found in your Avalara administration console upon Registration)
|
21
|
+
* Account Number
|
22
|
+
* License Key
|
23
|
+
* API URL
|
24
|
+
* Shipping Item Code or Tax Code
|
25
|
+
|
26
|
+
## Installation and Configuration
|
27
|
+
|
28
|
+
### 1) Add the Application gem to your gemfile in host application
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
gem 'workarea-avatax', '~> <version>'
|
32
|
+
```
|
33
|
+
|
34
|
+
### 2) Add Avatax Secrets
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
avatax:
|
38
|
+
username: AVATAX_USERNAME
|
39
|
+
password: AVATAX_PASSWORD
|
40
|
+
```
|
41
|
+
|
42
|
+
Optionally set the endpoint to sandbox for testing.
|
43
|
+
|
44
|
+
### 3) Configure the avatax plugin with the merchant's distribution center inside the host app's `config/initializers/workarea.rb` file
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
Workarea::Avatax.configure do |config|
|
48
|
+
config.dist_center = {
|
49
|
+
Line1: '1234 Your St',
|
50
|
+
Line2: '',
|
51
|
+
City: 'YourCity',
|
52
|
+
Region: 'Your State',
|
53
|
+
Country: 'US',
|
54
|
+
PostalCode: '123456'
|
55
|
+
}
|
56
|
+
end
|
57
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require "bundler/setup"
|
4
|
+
rescue LoadError
|
5
|
+
puts "You must `gem install bundler` and `bundle install` to run rake tasks"
|
6
|
+
end
|
7
|
+
|
8
|
+
require "rdoc/task"
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = "rdoc"
|
11
|
+
rdoc.title = "Moneris"
|
12
|
+
rdoc.options << "--line-numbers"
|
13
|
+
rdoc.rdoc_files.include("README.md")
|
14
|
+
rdoc.rdoc_files.include("lib/**/*.rb")
|
15
|
+
end
|
16
|
+
|
17
|
+
APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
|
18
|
+
load "rails/tasks/engine.rake"
|
19
|
+
load "rails/tasks/statistics.rake"
|
20
|
+
load "workarea/changelog.rake"
|
21
|
+
|
22
|
+
require "rake/testtask"
|
23
|
+
Rake::TestTask.new(:test) do |t|
|
24
|
+
t.libs << "lib"
|
25
|
+
t.libs << "test"
|
26
|
+
t.pattern = "test/**/*_test.rb"
|
27
|
+
t.verbose = false
|
28
|
+
end
|
29
|
+
task default: :test
|
30
|
+
|
31
|
+
$LOAD_PATH.unshift File.expand_path("lib", __dir__)
|
32
|
+
require "workarea/avatax/version"
|
33
|
+
|
34
|
+
desc "Release version #{Workarea::Avatax::VERSION} of the gem"
|
35
|
+
task :release do
|
36
|
+
host = "https://#{ENV['BUNDLE_GEMS__WEBLINC__COM']}@gems.weblinc.com"
|
37
|
+
|
38
|
+
Rake::Task["workarea:changelog"].execute
|
39
|
+
system "git add CHANGELOG.md"
|
40
|
+
system 'git commit -m "Update CHANGELOG"'
|
41
|
+
system "git push origin HEAD"
|
42
|
+
|
43
|
+
system "git tag -a v#{Workarea::Avatax::VERSION} -m 'Tagging #{Workarea::Avatax::VERSION}'"
|
44
|
+
system "git push --tags"
|
45
|
+
|
46
|
+
system "gem build workarea-avatax.gemspec"
|
47
|
+
system "gem push workarea-avatax-#{Workarea::Avatax::VERSION}.gem"
|
48
|
+
system "gem push workarea-avatax-#{Workarea::Avatax::VERSION}.gem --host #{host}"
|
49
|
+
system "rm workarea-avatax-#{Workarea::Avatax::VERSION}.gem"
|
50
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Avatax
|
3
|
+
class UsageType
|
4
|
+
include ApplicationDocument
|
5
|
+
|
6
|
+
field :code, type: String
|
7
|
+
field :name, type: String, localize: true
|
8
|
+
field :country_codes, type: Array
|
9
|
+
|
10
|
+
validates_presence_of :code, :name, :country_codes
|
11
|
+
|
12
|
+
def countries
|
13
|
+
country_codes.map { |code| Country[code] }.compact
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
module Workarea
|
2
|
+
module Pricing
|
3
|
+
module Calculators
|
4
|
+
# Calculates order/shipping sales tax via the Avalara Avatax API
|
5
|
+
#
|
6
|
+
class AvalaraTaxCalculator
|
7
|
+
include Calculator
|
8
|
+
|
9
|
+
def adjust
|
10
|
+
response = Avatax::TaxRequest.new(
|
11
|
+
order: order,
|
12
|
+
shippings: shippings,
|
13
|
+
**request_options
|
14
|
+
).response
|
15
|
+
|
16
|
+
return unless response.success?
|
17
|
+
|
18
|
+
shippings.each do |shipping|
|
19
|
+
next unless shipping.address.present?
|
20
|
+
|
21
|
+
price_adjustments_for(shipping).each do |adjustment|
|
22
|
+
tax_line = response.tax_line_for_adjustment adjustment, shipping: shipping
|
23
|
+
next unless tax_line.present?
|
24
|
+
|
25
|
+
adjust_pricing(
|
26
|
+
shipping,
|
27
|
+
tax_line,
|
28
|
+
"order_item_id" => adjustment._parent.id,
|
29
|
+
"adjustment" => adjustment.id
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
shipping_tax_line = response.tax_line_for_shipping(shipping)
|
34
|
+
adjust_pricing(shipping, shipping_tax_line, "shipping_service_tax" => true)
|
35
|
+
end
|
36
|
+
|
37
|
+
order.items.reject(&:shipping?).each do |non_shipped_item|
|
38
|
+
non_shipped_item.price_adjustments.each do |adjustment|
|
39
|
+
tax_line = response.tax_line_for_adjustment(adjustment)
|
40
|
+
next unless tax_line.present? && tax_line.tax.to_m > 0
|
41
|
+
|
42
|
+
data = {
|
43
|
+
'adjustment' => adjustment.id,
|
44
|
+
'order_item_id' => adjustment._parent.id,
|
45
|
+
'tax_code' => adjustment.data['tax_code']
|
46
|
+
}
|
47
|
+
|
48
|
+
non_shipped_item.adjust_pricing(
|
49
|
+
price: 'tax',
|
50
|
+
calculator: self.class.name,
|
51
|
+
description: 'Item Tax',
|
52
|
+
amount: tax_line.tax.to_m,
|
53
|
+
data: data.merge(find_line_details(tax_line))
|
54
|
+
)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
rescue Faraday::Error => error
|
59
|
+
Raven.capture_exception(error) if defined?(Raven)
|
60
|
+
avatax_fallback(error)
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
def request_options
|
66
|
+
{ timeout: 2 }
|
67
|
+
end
|
68
|
+
|
69
|
+
def avatax_fallback(_error)
|
70
|
+
Pricing::Calculators::TaxCalculator.new(request).adjust
|
71
|
+
end
|
72
|
+
alias_method :handle_timeout_error, :avatax_fallback
|
73
|
+
|
74
|
+
# If doing split shipping (different items go to different shipping
|
75
|
+
# addresses), decorate this method to return the proper price
|
76
|
+
# adjustments that match the shipping. (This will have to be added to
|
77
|
+
# the UI and saved, probably on the Shipping object)
|
78
|
+
#
|
79
|
+
# @return [PriceAdjustmentSet]
|
80
|
+
#
|
81
|
+
def price_adjustments_for(shipping)
|
82
|
+
order.price_adjustments
|
83
|
+
end
|
84
|
+
|
85
|
+
def adjust_pricing(shipping, tax_line, data = {})
|
86
|
+
return if tax_line.tax.to_m.zero?
|
87
|
+
|
88
|
+
shipping.adjust_pricing(
|
89
|
+
price: "tax",
|
90
|
+
calculator: self.class.name,
|
91
|
+
description: "Sales Tax",
|
92
|
+
amount: tax_line.tax.to_m,
|
93
|
+
data: data.merge(find_line_details(tax_line))
|
94
|
+
)
|
95
|
+
end
|
96
|
+
|
97
|
+
def find_line_details(tax_line)
|
98
|
+
tax_line.details.each_with_object({}) do |detail, memo|
|
99
|
+
memo[detail.taxName] = detail.rate
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Workarea
|
2
|
+
class AvataxSeeds
|
3
|
+
def perform
|
4
|
+
return unless AvaTax.config[:username].present? && AvaTax.config[:password].present?
|
5
|
+
puts "Adding Avalara Usage Types..."
|
6
|
+
|
7
|
+
result = ::AvaTax.list_entity_use_codes
|
8
|
+
raise "Failed to get avatax usage codes from api" unless result.success?
|
9
|
+
|
10
|
+
result.body["value"].each do |entity_use_code|
|
11
|
+
Workarea::Avatax::UsageType.find_or_create_by(
|
12
|
+
code: entity_use_code["code"],
|
13
|
+
name: formatted_names.fetch(entity_use_code["name"], entity_use_code["name"]),
|
14
|
+
country_codes: entity_use_code["validCountries"]
|
15
|
+
)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def formatted_names
|
22
|
+
{
|
23
|
+
"FEDERAL GOV" => "Federal Government",
|
24
|
+
"STATE GOV" => "State Government",
|
25
|
+
"TRIBAL GOVERNMENT" => "Tribal Government",
|
26
|
+
"FOREIGN DIPLOMAT" => "Foreign diplomat",
|
27
|
+
"CHARITABLE/EXEMPT ORG" => "Charitable or excempt org",
|
28
|
+
"RELIGIOUS ORG" => "Religious or educational org",
|
29
|
+
"EDUCATIONAL ORG" => "Educational org",
|
30
|
+
"RESALE" => "Resale",
|
31
|
+
"AGRICULTURE" => "Commercial agricultural production",
|
32
|
+
"INDUSTRIAL PROD/MANUFACTURERS" => "Industrial production / manufacturer",
|
33
|
+
"DIRECT PAY" => "Direct pay permit",
|
34
|
+
"DIRECT MAIL" => "Direct mail",
|
35
|
+
"OTHER/CUSTOM" => "Other or custom",
|
36
|
+
"LOCAL GOVERNMENT" => "Local Government",
|
37
|
+
"COMMERCIAL AQUACULTURE" => "Commercial aquaculture",
|
38
|
+
"COMMERCIAL FISHERY" => "Commercial fishery",
|
39
|
+
"NON-RESIDENT" => "Non-resident",
|
40
|
+
"NON-EXEMPT TAXABLE CUSTOMER" => "Non-excempt taxable customer"
|
41
|
+
}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Workarea
|
2
|
+
decorate Admin::UserViewModel, with: :avatax do
|
3
|
+
def avatax_usage_options
|
4
|
+
Avatax::UsageType.all.map do |usage_type|
|
5
|
+
[usage_type_display(usage_type), usage_type.code]
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def usage_type_display(usage_type)
|
12
|
+
countries =
|
13
|
+
if usage_type.countries.empty?
|
14
|
+
""
|
15
|
+
else
|
16
|
+
"(#{usage_type.countries.map(&:local_name).join(', ')})"
|
17
|
+
end
|
18
|
+
[usage_type.name, countries].compact.join(' ')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,5 @@
|
|
1
|
+
.property
|
2
|
+
= label_tag 'user[customer_usage_type]', nil, class: 'property__name' do
|
3
|
+
%span.property__text= t('workarea.admin.users.edit.avatax_entity_use_code')
|
4
|
+
.value
|
5
|
+
= select_tag 'user[customer_usage_type]', options_for_select(@user.avatax_usage_options, @user.customer_usage_type)
|