solidus_me 1.0.7 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +17 -5
- data/app/controller/spree/admin/solidus_me/accounts_controller.rb +69 -0
- data/app/models/solidus_me/account.rb +23 -0
- data/app/models/solidus_me/shipping_estimator.rb +19 -16
- data/app/views/spree/admin/solidus_me/accounts/_form.html.erb +58 -0
- data/app/views/spree/admin/solidus_me/accounts/edit.html.erb +1 -0
- data/app/views/spree/admin/solidus_me/accounts/index.html.erb +12 -0
- data/app/views/spree/admin/solidus_me/accounts/new.html.erb +1 -0
- data/bin/meu_sandbox +67 -0
- data/config/routes.rb +5 -2
- data/db/migrate/20231109124213_create_solidus_me_accounts.rb +17 -0
- data/lib/solidus_me/engine.rb +1 -1
- data/lib/solidus_me/version.rb +1 -1
- data/spec/models/solidus_me/account_spec.rb +7 -0
- metadata +12 -7
- data/app/controller/spree/admin/melhor_envio_controller.rb +0 -43
- data/app/models/solidus_me/preferences.rb +0 -30
- data/app/overrides/store_preferences.rb +0 -23
- data/app/views/spree/admin/melhor_envio/index.html.erb +0 -58
- data/db/migrate/20231103133348_add_preferences_to_spree_store.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3a2ad07ac04979f655717473221f63da37b4e8b1bb643808d82e24f7b8aad898
|
4
|
+
data.tar.gz: a4ee64d15ebf5a5157741d587a39cea98be11d58b0701101219a1d96a59c2151
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2bb413c52707e0726ae2b8a90090c84cbfc808dadf7ccdaedcfc67e74d937503923c613fc0ff79d11fb18921d37c8817e330b0cad44c019e5d47e7cbaaaa2a0a
|
7
|
+
data.tar.gz: a4b5d06c444ef8d27c124967e29513d36eb40e7ceed957a608b8536756dcc5a623e323a8955fdc6e0e567183774d96f15a6c1facc2eb53a2f4b86623a8add159
|
data/README.md
CHANGED
@@ -7,24 +7,34 @@ Gem para cotar empresas e valores de entrega junto à Api do Melhor Envio.
|
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
10
|
-
|
10
|
+
Adicionar solidus_me ao Gemfile:
|
11
11
|
|
12
12
|
```ruby
|
13
13
|
gem 'solidus_me'
|
14
14
|
```
|
15
15
|
|
16
|
-
|
16
|
+
Executar:
|
17
17
|
|
18
18
|
```shell
|
19
|
+
bundle
|
19
20
|
bin/rails generate solidus_me:install
|
20
21
|
```
|
22
|
+
|
23
|
+
Executar o comando para instalar a gem de dependências `solidus_brasilian_adaptations`:
|
24
|
+
|
25
|
+
```shell
|
26
|
+
bin/rails generate solidus_brazilian_adaptations:install
|
27
|
+
```
|
28
|
+
|
29
|
+
Após, seguir o [tutorial](https://github.com/ulysses-bull/solidus_brazilian_adaptations) da gem `soluds_brazilian_adaptations`
|
30
|
+
|
21
31
|
Adicionar no arquivo `/config/initilizers/spree.rb`
|
22
32
|
|
23
33
|
```ruby
|
24
34
|
Spree.config do |config|
|
25
|
-
|
35
|
+
+++
|
26
36
|
config.stock.estimator_class = "SolidusMe::ShippingEstimator"
|
27
|
-
|
37
|
+
+++
|
28
38
|
end
|
29
39
|
```
|
30
40
|
|
@@ -34,8 +44,10 @@ No painel do admin será adiconado o item do `Melhor Envio` no menu lateral. Nes
|
|
34
44
|
CEP de origem:
|
35
45
|
Client ID:
|
36
46
|
Client Secret:
|
47
|
+
Redirect Url:
|
48
|
+
State:
|
37
49
|
```
|
38
|
-
Após salvar, o link completo para autenticação do aplicativo ficará disponível abaixo. Uma vez autorizado, são gerados os `refresh_token` e `access_token`, e o sistema estará pronto para cotação dos fretes junto ao Melhor Envio.
|
50
|
+
Após salvar, o link completo para autenticação do aplicativo ficará disponível abaixo. A gem disponibiliza um endpoint (`HOST/admin/melhor_envio/authorize`) para receber o code e realizar a autenticação automaticamente. Uma vez autorizado, são gerados os `refresh_token` e `access_token`, e o sistema estará pronto para cotação dos fretes junto ao Melhor Envio.
|
39
51
|
|
40
52
|
Por padrão, os serviços de entrega são os `SEDEX`, `PAC` e `MiniEnvios` dos CORREIOS. Porém, os serviços podem ser customizados de acordo com a necessidade. Basta adicioná-los aos `preferences` da `Spree::Store`:
|
41
53
|
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Spree
|
2
|
+
module Admin
|
3
|
+
module SolidusMe
|
4
|
+
|
5
|
+
class AccountsController < BaseController
|
6
|
+
|
7
|
+
def index
|
8
|
+
@accounts = ::SolidusMe::Account.all
|
9
|
+
end
|
10
|
+
|
11
|
+
def new
|
12
|
+
@me_account = ::SolidusMe::Account.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def create
|
16
|
+
me_account = ::SolidusMe::Account.new account_params
|
17
|
+
if me_account.save
|
18
|
+
flash[:success] = "Conta criada com sucesso"
|
19
|
+
redirect_to admin_solidus_me_accounts_path
|
20
|
+
else
|
21
|
+
flash[:error] = me_account.errors.full_messages.join("\n")
|
22
|
+
redirect_to new_admin_solidus_me_account_path
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def edit
|
27
|
+
@me_account = ::SolidusMe::Account.find(params[:id])
|
28
|
+
end
|
29
|
+
|
30
|
+
def update
|
31
|
+
me_account = ::SolidusMe::Account.find(params[:id])
|
32
|
+
me_account.update account_params
|
33
|
+
redirect_to edit_admin_solidus_me_account_path(me_account.id)
|
34
|
+
end
|
35
|
+
|
36
|
+
def destroy
|
37
|
+
me_account = ::SolidusMe::Account.find(params[:id])
|
38
|
+
me_account.delete
|
39
|
+
redirect_to admin_solidus_me_accounts_path
|
40
|
+
end
|
41
|
+
|
42
|
+
def authorize
|
43
|
+
code = params[:code]
|
44
|
+
me_account = ::SolidusMe::Account.first
|
45
|
+
authorize_json = MeApi::Client.new.authorize(
|
46
|
+
client_id: me_account.client_id,
|
47
|
+
client_secret: me_account.client_secret,
|
48
|
+
code: code,
|
49
|
+
redirect_url: me_account.redirect_url
|
50
|
+
).json
|
51
|
+
me_account.update(
|
52
|
+
access_token: authorize_json["access_token"],
|
53
|
+
refresh_token: authorize_json["refresh_token"],
|
54
|
+
token_expires_in: (DateTime.now + authorize_json["expires_in"].seconds).to_s
|
55
|
+
)
|
56
|
+
redirect_to edit_admin_solidus_me_account_path me_account
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def account_params
|
62
|
+
params.require(:account).permit(
|
63
|
+
:client_id, :client_secret, :access_token, :refresh_token, :redirect_url, :state, :token_expires_in, :services, :postal_code_from
|
64
|
+
)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module SolidusMe
|
2
|
+
class Account < ApplicationRecord
|
3
|
+
|
4
|
+
def check_token
|
5
|
+
return if client_id.blank? || client_secret.blank? || refresh_token.blank?
|
6
|
+
return if (token_expires_in - 1.day) > DateTime.now
|
7
|
+
refresh
|
8
|
+
end
|
9
|
+
|
10
|
+
def refresh
|
11
|
+
refresh_json = MeApi::Client.new.refresh_token(
|
12
|
+
client_id: client_id,
|
13
|
+
client_secret: client_secret,
|
14
|
+
refresh_token: refresh_token
|
15
|
+
).json
|
16
|
+
access_token = refresh_json["access_token"]
|
17
|
+
refresh_token = refresh_json["refresh_token"]
|
18
|
+
token_expires_in = DateTime.now.utc + refresh_json["expires_in"].seconds
|
19
|
+
self.update(access_token: access_token, refresh_token: refresh_token, token_expires_in: token_expires_in)
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
module SolidusMe
|
2
2
|
class ShippingEstimator
|
3
3
|
|
4
|
-
def initialize
|
5
|
-
store = Spree::Store.first
|
6
|
-
@preferences = Preferences.new(store).preferences
|
7
|
-
@me_client = MeApi::Client.new(@preferences[:access_token])
|
8
|
-
end
|
9
|
-
|
10
4
|
def shipping_rates(package, _frontend_only = true)
|
5
|
+
@me_account = Account.first
|
6
|
+
return [] if @me_account.blank?
|
7
|
+
|
8
|
+
@me_account.check_token
|
9
|
+
@me_client = MeApi::Client.new(@me_account.access_token)
|
10
|
+
|
11
11
|
melhor_envio_rates = get_rates_from_melhor_envio(package)
|
12
12
|
shipping_rates = melhor_envio_rates.map do |melhor_envio_rate|
|
13
13
|
build_shipping_rate(melhor_envio_rate, package)
|
@@ -28,24 +28,17 @@ module SolidusMe
|
|
28
28
|
weight = package.contents.map {|content| content.weight }.sum
|
29
29
|
price = package.contents.map {|content| content.price }.sum
|
30
30
|
zipcode = package.order.ship_address.zipcode
|
31
|
-
services = @
|
31
|
+
services = @me_account.services.blank? ? ["SEDEX", "PAC", "Mini Envios", ".Package", ".Com"] : @me_account.services
|
32
32
|
|
33
33
|
rates = @me_client.rates(
|
34
|
-
from: @
|
34
|
+
from: @me_account.postal_code_from,
|
35
35
|
to: zipcode,
|
36
36
|
weight_kg: (weight/1000),
|
37
37
|
contents_value_brl: price
|
38
38
|
)
|
39
39
|
rates.select { |rate| rate.price > 0 && services.include?(rate.service_name) }
|
40
40
|
rescue
|
41
|
-
[
|
42
|
-
OpenStruct.new({
|
43
|
-
price: 15.00,
|
44
|
-
service_name: "",
|
45
|
-
carrier_name: "Frete padrão",
|
46
|
-
delivery_range: { "min" => 5, "max" => 5 }
|
47
|
-
})
|
48
|
-
]
|
41
|
+
[default_rate]
|
49
42
|
end
|
50
43
|
end
|
51
44
|
|
@@ -67,5 +60,15 @@ module SolidusMe
|
|
67
60
|
max_delivery_time: melhor_envio_rate.delivery_range["max"]
|
68
61
|
)
|
69
62
|
end
|
63
|
+
|
64
|
+
def default_rate
|
65
|
+
default_rate = Data.define(:price, :service_name, :carrier_name, :delivery_range)
|
66
|
+
default_rate.new(
|
67
|
+
price: 15.00,
|
68
|
+
service_name: "",
|
69
|
+
carrier_name: "Frete padrão",
|
70
|
+
delivery_range: { "min" => 5, "max" => 5 }
|
71
|
+
)
|
72
|
+
end
|
70
73
|
end
|
71
74
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
<%= form_with model: me_account, url: form_url do |form| %>
|
2
|
+
<h3>Melhor Envio</h3>
|
3
|
+
|
4
|
+
<div style="margin-top: 10px;">
|
5
|
+
<%= form.label :postal_code_from, "CEP de Origem: " %>
|
6
|
+
<%= form.text_field :postal_code_from, value: me_account.postal_code_from %>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div style="margin-top: 10px;">
|
10
|
+
<%= form.hidden_field :services, value: me_account.services %>
|
11
|
+
<span>Serviços Disponíveis: <%= me_account.services %></span>
|
12
|
+
</div>
|
13
|
+
|
14
|
+
<div style="margin-top: 10px;">
|
15
|
+
<%= form.label :client_id, "Client ID: " %>
|
16
|
+
<%= form.text_field :client_id, value: me_account.client_id %>
|
17
|
+
</div>
|
18
|
+
|
19
|
+
<div style="margin-top: 10px;">
|
20
|
+
<%= form.label :client_secret, "Client Secret: " %>
|
21
|
+
<%= form.text_field :client_secret, value: me_account.client_secret %>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div style="margin-top: 10px;">
|
25
|
+
<%= form.label :redirect_url, "Redirect URL: " %>
|
26
|
+
<%= form.text_field :redirect_url, value: me_account.redirect_url %>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<div style="margin-top: 10px;">
|
30
|
+
<%= form.label :state, "State: " %>
|
31
|
+
<%= form.text_field :state, value: me_account.state %>
|
32
|
+
</div>
|
33
|
+
|
34
|
+
<div style="margin-top: 10px;">
|
35
|
+
<%= form.label :access_token, "Access Token: " %>
|
36
|
+
<%= form.text_field :access_token, value: me_account.access_token %>
|
37
|
+
</div>
|
38
|
+
|
39
|
+
<div style="margin-top: 10px;">
|
40
|
+
<%= form.label :refresh_token, "Refresh Token: " %>
|
41
|
+
<%= form.text_field :refresh_token, value: me_account.refresh_token %>
|
42
|
+
</div>
|
43
|
+
|
44
|
+
<div style="margin-top: 10px;">
|
45
|
+
<%= form.hidden_field :token_expires_in, value: me_account.token_expires_in %>
|
46
|
+
<span>Expiração do token: <%= me_account.token_expires_in %></span>
|
47
|
+
</div>
|
48
|
+
|
49
|
+
<%= form.submit "Salvar", style: "margin-top: 10px;" %>
|
50
|
+
<% end %>
|
51
|
+
|
52
|
+
<div>
|
53
|
+
<input value="https://www.melhorenvio.com.br/oauth/authorize?client_id=<%= me_account.client_id %>&redirect_uri=<%= me_account.redirect_url %>&response_type=code&state=<%= me_account.state %>&scope=shipping-calculate">
|
54
|
+
<a target="_blank" class="" href="https://www.melhorenvio.com.br/oauth/authorize?client_id=<%= me_account.client_id %>&redirect_uri=<%= me_account.redirect_url %>&response_type=code&state=<%= me_account.state %>&scope=shipping-calculate">
|
55
|
+
<svg style="width: 24px; height: 24px;" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
56
|
+
<path stroke-linecap="round" stroke-linejoin="round" d="M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25"></path></svg>
|
57
|
+
</a>
|
58
|
+
</div>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render "form", me_account: @me_account, form_url: admin_solidus_me_account_path(@me_account.id) %>
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<%= link_to("Criar", new_admin_solidus_me_account_path) if @accounts.count > 1 %>
|
2
|
+
<div>
|
3
|
+
<% @accounts.each do |account| %>
|
4
|
+
<div>
|
5
|
+
<% account.attributes.each do |attribute| %>
|
6
|
+
<div style="overflow-wrap: break-word;"> <%= attribute[0] %>: <%= attribute[1] %></div>
|
7
|
+
<% end %>
|
8
|
+
<%= link_to "Editar", edit_admin_solidus_me_account_path(account.id) %>
|
9
|
+
<%= link_to "Excluir", admin_solidus_me_account_path(account.id), method: :delete %>
|
10
|
+
</div>
|
11
|
+
<% end %>
|
12
|
+
</div>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render "form", me_account: @me_account, form_url: admin_solidus_me_accounts_path %>
|
data/bin/meu_sandbox
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
bin/rails db:environment:set RAILS_ENV=development
|
4
|
+
|
5
|
+
set -e
|
6
|
+
test -z "${DEBUG+empty_string}" || set -x
|
7
|
+
|
8
|
+
if [ -z "$SOLIDUS_BRANCH" ]
|
9
|
+
then
|
10
|
+
echo "~~> Use 'export SOLIDUS_BRANCH=[main|v3.2|...]' to control the Solidus branch"
|
11
|
+
SOLIDUS_BRANCH="main"
|
12
|
+
fi
|
13
|
+
echo "~~> Using branch $SOLIDUS_BRANCH of solidus"
|
14
|
+
|
15
|
+
extension_name="solidus_me"
|
16
|
+
|
17
|
+
# Stay away from the bundler env of the containing extension.
|
18
|
+
function unbundled {
|
19
|
+
ruby -rbundler -e'b = proc {system *ARGV}; Bundler.respond_to?(:with_unbundled_env) ? Bundler.with_unbundled_env(&b) : Bundler.with_clean_env(&b)' -- $@
|
20
|
+
}
|
21
|
+
|
22
|
+
rm -rf ./sandbox
|
23
|
+
unbundled bundle exec rails new sandbox \
|
24
|
+
--database=postgresql \
|
25
|
+
--skip-bundle \
|
26
|
+
--skip-git \
|
27
|
+
--skip-keeps \
|
28
|
+
--skip-rc \
|
29
|
+
--skip-spring \
|
30
|
+
--skip-test \
|
31
|
+
--skip-javascript
|
32
|
+
|
33
|
+
if [ ! -d "sandbox" ]; then
|
34
|
+
echo 'sandbox rails application failed'
|
35
|
+
exit 1
|
36
|
+
fi
|
37
|
+
|
38
|
+
cd ./sandbox
|
39
|
+
cat <<RUBY >> Gemfile
|
40
|
+
gem 'solidus', github: 'solidusio/solidus', branch: '$SOLIDUS_BRANCH'
|
41
|
+
gem 'rails-i18n'
|
42
|
+
gem 'solidus_i18n'
|
43
|
+
|
44
|
+
gem '$extension_name', path: '..'
|
45
|
+
|
46
|
+
group :test, :development do
|
47
|
+
platforms :mri do
|
48
|
+
gem 'pry-byebug'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
RUBY
|
52
|
+
|
53
|
+
unbundled bundle install --gemfile Gemfile
|
54
|
+
|
55
|
+
unbundled bundle exec rake db:drop db:create
|
56
|
+
|
57
|
+
unbundled bundle exec rails generate solidus:install \
|
58
|
+
--auto-accept \
|
59
|
+
--payment-method=none \
|
60
|
+
--frontend=starter \
|
61
|
+
$@
|
62
|
+
|
63
|
+
unbundled bundle exec rails generate ${extension_name}:install --auto-run-migrations
|
64
|
+
|
65
|
+
echo
|
66
|
+
echo "🚀 Sandbox app successfully created for $extension_name!"
|
67
|
+
echo "🧪 This app is intended for test purposes."
|
data/config/routes.rb
CHANGED
@@ -2,7 +2,10 @@
|
|
2
2
|
|
3
3
|
Spree::Core::Engine.routes.draw do
|
4
4
|
namespace :admin do
|
5
|
-
|
6
|
-
|
5
|
+
namespace :solidus_me do
|
6
|
+
resources :accounts do
|
7
|
+
get "authorize", on: :collection
|
8
|
+
end
|
9
|
+
end
|
7
10
|
end
|
8
11
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class CreateSolidusMeAccounts < ActiveRecord::Migration[7.0]
|
2
|
+
def change
|
3
|
+
create_table :solidus_me_accounts do |t|
|
4
|
+
t.string :client_id
|
5
|
+
t.string :client_secret
|
6
|
+
t.string :access_token
|
7
|
+
t.string :refresh_token
|
8
|
+
t.string :redirect_url
|
9
|
+
t.string :state
|
10
|
+
t.datetime :token_expires_in
|
11
|
+
t.string :services
|
12
|
+
t.string :postal_code_from
|
13
|
+
|
14
|
+
t.timestamps
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/solidus_me/engine.rb
CHANGED
data/lib/solidus_me/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solidus_me
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hamilton Tumenas Borges
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: solidus_core
|
@@ -104,12 +104,15 @@ files:
|
|
104
104
|
- LICENSE
|
105
105
|
- README.md
|
106
106
|
- Rakefile
|
107
|
-
- app/controller/spree/admin/
|
108
|
-
- app/models/solidus_me/
|
107
|
+
- app/controller/spree/admin/solidus_me/accounts_controller.rb
|
108
|
+
- app/models/solidus_me/account.rb
|
109
109
|
- app/models/solidus_me/shipping_estimator.rb
|
110
|
-
- app/
|
111
|
-
- app/views/spree/admin/
|
110
|
+
- app/views/spree/admin/solidus_me/accounts/_form.html.erb
|
111
|
+
- app/views/spree/admin/solidus_me/accounts/edit.html.erb
|
112
|
+
- app/views/spree/admin/solidus_me/accounts/index.html.erb
|
113
|
+
- app/views/spree/admin/solidus_me/accounts/new.html.erb
|
112
114
|
- bin/console
|
115
|
+
- bin/meu_sandbox
|
113
116
|
- bin/rails
|
114
117
|
- bin/rails-engine
|
115
118
|
- bin/rails-sandbox
|
@@ -119,7 +122,7 @@ files:
|
|
119
122
|
- config/locales/en.yml
|
120
123
|
- config/locales/pt-BR.yml
|
121
124
|
- config/routes.rb
|
122
|
-
- db/migrate/
|
125
|
+
- db/migrate/20231109124213_create_solidus_me_accounts.rb
|
123
126
|
- lib/generators/solidus_me/install/install_generator.rb
|
124
127
|
- lib/generators/solidus_me/install/templates/initializer.rb
|
125
128
|
- lib/solidus_me.rb
|
@@ -128,6 +131,7 @@ files:
|
|
128
131
|
- lib/solidus_me/testing_support/factories.rb
|
129
132
|
- lib/solidus_me/version.rb
|
130
133
|
- solidus_me.gemspec
|
134
|
+
- spec/models/solidus_me/account_spec.rb
|
131
135
|
- spec/spec_helper.rb
|
132
136
|
homepage: https://github.com/solidusio-contrib/solidus_me#readme
|
133
137
|
licenses:
|
@@ -159,4 +163,5 @@ signing_key:
|
|
159
163
|
specification_version: 4
|
160
164
|
summary: Gem para integração com a API do Melhor Envio
|
161
165
|
test_files:
|
166
|
+
- spec/models/solidus_me/account_spec.rb
|
162
167
|
- spec/spec_helper.rb
|
@@ -1,43 +0,0 @@
|
|
1
|
-
module Spree
|
2
|
-
module Admin
|
3
|
-
class MelhorEnvioController < BaseController
|
4
|
-
before_action :set_melhor_envio_preferences
|
5
|
-
|
6
|
-
def index
|
7
|
-
end
|
8
|
-
|
9
|
-
def update
|
10
|
-
@me_preferences = preferences_params
|
11
|
-
Spree::Store.first.update(preferences: { melhor_envio: @me_preferences })
|
12
|
-
redirect_to admin_melhor_envio_index_path
|
13
|
-
end
|
14
|
-
|
15
|
-
def authorize
|
16
|
-
code = params[:code]
|
17
|
-
authorize_json = MeApi::Client.new.authorize(
|
18
|
-
client_id: @me_preferences[:client_id],
|
19
|
-
client_secret: @me_preferences[:client_secret],
|
20
|
-
code: code,
|
21
|
-
redirect_url: @me_preferences[:redirect_url]
|
22
|
-
).json
|
23
|
-
@me_preferences[:access_token] = authorize_json["access_token"]
|
24
|
-
@me_preferences[:refresh_token] = authorize_json["refresh_token"]
|
25
|
-
@me_preferences[:token_expires_in] = (DateTime.now + authorize_json["expires_in"].seconds).to_s
|
26
|
-
Spree::Store.first.update(preferences: { melhor_envio: @me_preferences })
|
27
|
-
redirect_to admin_melhor_envio_index_path
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
def set_melhor_envio_preferences
|
33
|
-
@me_preferences = Spree::Store.first.preferences[:melhor_envio]
|
34
|
-
end
|
35
|
-
|
36
|
-
def preferences_params
|
37
|
-
hash_preferences = params.permit(:postal_code_from, :services, :client_id, :client_secret, :redirect_url, :state, :access_token, :refresh_token, :token_expires_in)
|
38
|
-
hash_preferences[:services] = hash_preferences[:services].split(" ")
|
39
|
-
hash_preferences.to_h
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module SolidusMe
|
2
|
-
class Preferences
|
3
|
-
|
4
|
-
attr_reader :preferences
|
5
|
-
def initialize store
|
6
|
-
@store = store
|
7
|
-
@preferences = store.preferences[:melhor_envio]
|
8
|
-
check
|
9
|
-
end
|
10
|
-
|
11
|
-
def check
|
12
|
-
return if @preferences[:client_id].blank? || @preferences[:client_secret].blank? || @preferences[:refresh_token].blank?
|
13
|
-
return if (@preferences[:token_expires_in]&.to_datetime - 1.day) > DateTime.now
|
14
|
-
refresh
|
15
|
-
end
|
16
|
-
|
17
|
-
def refresh
|
18
|
-
refresh_json = MeApi::Client.new.refresh_token(
|
19
|
-
client_id: @preferences[:client_id],
|
20
|
-
client_secret: @preferences[:client_secret],
|
21
|
-
refresh_token: @preferences[:refresh_token]
|
22
|
-
).json
|
23
|
-
@preferences[:access_token] = refresh_json["access_token"]
|
24
|
-
@preferences[:refresh_token] = refresh_json["refresh_token"]
|
25
|
-
@preferences[:token_expires_in] = (DateTime.now.utc + refresh_json["expires_in"].seconds).to_s
|
26
|
-
@store.update(preferences: { melhor_envio: @preferences })
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
module StorePreferences
|
2
|
-
extend ActiveSupport::Concern
|
3
|
-
|
4
|
-
prepended do
|
5
|
-
require 'spree/preferences/persistable'
|
6
|
-
|
7
|
-
include Spree::Preferences::Persistable
|
8
|
-
|
9
|
-
preference :melhor_envio, :json, default: {
|
10
|
-
postal_code_from: "13870320",
|
11
|
-
services: ["SEDEX", "PAC", "Mini Envios"],
|
12
|
-
client_id: nil,
|
13
|
-
client_secret: nil,
|
14
|
-
redirect_url: nil,
|
15
|
-
state: nil,
|
16
|
-
access_token: nil,
|
17
|
-
refresh_token: nil,
|
18
|
-
token_expires_in: DateTime.now.to_s
|
19
|
-
}
|
20
|
-
end
|
21
|
-
|
22
|
-
::Spree::Store.prepend self
|
23
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
<%= form_with url: admin_melhor_envio_path("melhor_envio"), method: :put do |form| %>
|
2
|
-
<h3>Melhor Envio</h3>
|
3
|
-
|
4
|
-
<div style="margin-top: 10px;">
|
5
|
-
<%= form.label :postal_code_from, "CEP de Origem: " %>
|
6
|
-
<%= form.text_field :postal_code_from, value: @me_preferences[:postal_code_from] %>
|
7
|
-
</div>
|
8
|
-
|
9
|
-
<div style="margin-top: 10px;">
|
10
|
-
<%= form.hidden_field :services, value: @me_preferences[:services] %>
|
11
|
-
<span>Serviços Disponíveis: <%= @me_preferences[:services]&.join(", ") %></span>
|
12
|
-
</div>
|
13
|
-
|
14
|
-
<div style="margin-top: 10px;">
|
15
|
-
<%= form.label :client_id, "Client ID: " %>
|
16
|
-
<%= form.text_field :client_id, value: @me_preferences[:client_id] %>
|
17
|
-
</div>
|
18
|
-
|
19
|
-
<div style="margin-top: 10px;">
|
20
|
-
<%= form.label :client_secret, "Client Secret: " %>
|
21
|
-
<%= form.text_field :client_secret, value: @me_preferences[:client_secret] %>
|
22
|
-
</div>
|
23
|
-
|
24
|
-
<div style="margin-top: 10px;">
|
25
|
-
<%= form.label :redirect_url, "Redirect URL: " %>
|
26
|
-
<%= form.text_field :redirect_url, value: @me_preferences[:redirect_url] %>
|
27
|
-
</div>
|
28
|
-
|
29
|
-
<div style="margin-top: 10px;">
|
30
|
-
<%= form.label :state, "State: " %>
|
31
|
-
<%= form.text_field :state, value: @me_preferences[:state] %>
|
32
|
-
</div>
|
33
|
-
|
34
|
-
<div style="margin-top: 10px;">
|
35
|
-
<%= form.label :access_token, "Access Token: " %>
|
36
|
-
<%= form.text_field :access_token, value: @me_preferences[:access_token] %>
|
37
|
-
</div>
|
38
|
-
|
39
|
-
<div style="margin-top: 10px;">
|
40
|
-
<%= form.label :refresh_token, "Refresh Token: " %>
|
41
|
-
<%= form.text_field :refresh_token, value: @me_preferences[:refresh_token] %>
|
42
|
-
</div>
|
43
|
-
|
44
|
-
<div style="margin-top: 10px;">
|
45
|
-
<%= form.hidden_field :token_expires_in, value: @me_preferences[:token_expires_in] %>
|
46
|
-
<span>Expiração do token: <%= @me_preferences[:token_expires_in] %></span>
|
47
|
-
</div>
|
48
|
-
|
49
|
-
<%= form.submit "Salvar", style: "margin-top: 10px;" %>
|
50
|
-
<% end %>
|
51
|
-
|
52
|
-
<div>
|
53
|
-
<input value="https://www.melhorenvio.com.br/oauth/authorize?client_id=<%= @me_preferences[:client_id] %>&redirect_uri=<%= @me_preferences[:redirect_url] %>&response_type=code&state=<%= @me_preferences[:state] %>&scope=shipping-calculate">
|
54
|
-
<a target="_blank" class="" href="https://www.melhorenvio.com.br/oauth/authorize?client_id=<%= @me_preferences[:client_id] %>&redirect_uri=<%= @me_preferences[:redirect_url] %>&response_type=code&state=<%= @me_preferences[:state] %>&scope=shipping-calculate">
|
55
|
-
<svg style="width: 24px; height: 24px;" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
56
|
-
<path stroke-linecap="round" stroke-linejoin="round" d="M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25"></path></svg>
|
57
|
-
</a>
|
58
|
-
</div>
|