solidus_me 3.5.2 → 3.6.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 +4 -4
- data/app/controller/spree/admin/solidus_me/accounts_controller.rb +11 -2
- data/app/models/solidus_me/account.rb +31 -0
- data/app/models/solidus_me/melhor_envio.rb +39 -17
- data/app/views/spree/admin/solidus_me/accounts/_form.html.erb +106 -12
- data/app/views/spree/admin/solidus_me/accounts/index.html.erb +105 -39
- data/config/routes.rb +1 -0
- data/db/migrate/20250731123741_add_columns_to_me_account.rb +14 -0
- data/lib/solidus_me/version.rb +1 -1
- metadata +6 -6
- data/app/models/solidus_me/shipping_estimator.rb +0 -96
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c1f7124426c0b227f783eafc7c7fdd1deda02e76d91a9b8ae6fce7e6eb97d8d1
|
4
|
+
data.tar.gz: f293dbcab591dc6df18ad5f2e7d1f9155829691b22ed5450690d36221ba3c284
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d9ab1662b0e051843e182185bbde45ec63cb1fa93234f78a66fa2cd108fad32037886625df9187965430721fabe7b1c0b066dd6312eeadf17dc8210c1a8842af
|
7
|
+
data.tar.gz: 4fa4637fbb2055f194f7fc41cd6a7d875636fa5d6bdc5ef7b81ea517cd282a7ee9e425a919a355cb662b00d2f6768ff9125f69fa5b87afd6e2f1876a74d2cce0
|
@@ -2,7 +2,7 @@ module Spree
|
|
2
2
|
module Admin
|
3
3
|
module SolidusMe
|
4
4
|
class AccountsController < BaseController
|
5
|
-
before_action :set_account, only: [:edit, :update, :destroy]
|
5
|
+
before_action :set_account, only: [:edit, :update, :destroy, :update_from_api]
|
6
6
|
|
7
7
|
def index
|
8
8
|
@accounts = ::SolidusMe::Account.all
|
@@ -58,11 +58,20 @@ module Spree
|
|
58
58
|
redirect_to edit_admin_solidus_me_account_path me_account
|
59
59
|
end
|
60
60
|
|
61
|
+
def update_from_api
|
62
|
+
@me_account.sync_with_api_data
|
63
|
+
flash[:success] = "Dados da conta atualizados a partir da API"
|
64
|
+
redirect_to edit_admin_solidus_me_account_path(@me_account.id)
|
65
|
+
rescue StandardError => e
|
66
|
+
flash[:error] = "Erro ao atualizar dados da conta: #{e.message}"
|
67
|
+
redirect_to edit_admin_solidus_me_account_path(@me_account.id)
|
68
|
+
end
|
69
|
+
|
61
70
|
private
|
62
71
|
|
63
72
|
def account_params
|
64
73
|
params.require(:account).permit(
|
65
|
-
:client_id, :client_secret, :access_token, :refresh_token, :redirect_url, :state, :token_expires_in, :services, :postal_code_from
|
74
|
+
:client_id, :client_secret, :access_token, :refresh_token, :redirect_url, :state, :token_expires_in, :services, :postal_code_from, :name, :email, :tax_id, :phone, :address, :address_complement, :address_number, :address_district, :address_city, :address_state_abbr
|
66
75
|
)
|
67
76
|
end
|
68
77
|
|
@@ -17,5 +17,36 @@ module SolidusMe
|
|
17
17
|
token_expires_in = DateTime.now.utc + refresh_json["expires_in"].seconds
|
18
18
|
update(access_token: access_token, refresh_token: refresh_token, token_expires_in: token_expires_in)
|
19
19
|
end
|
20
|
+
|
21
|
+
def account_data
|
22
|
+
me_client.get_account_data
|
23
|
+
end
|
24
|
+
|
25
|
+
def balance
|
26
|
+
me_client.get_balance
|
27
|
+
end
|
28
|
+
|
29
|
+
def sync_with_api_data
|
30
|
+
data = account_data
|
31
|
+
|
32
|
+
update(
|
33
|
+
name: data.name,
|
34
|
+
email: data.email,
|
35
|
+
tax_id: data.document,
|
36
|
+
phone: data.phone.phone,
|
37
|
+
address: data.address&.address,
|
38
|
+
address_complement: data.address&.complement,
|
39
|
+
address_number: data.address&.number,
|
40
|
+
address_district: data.address&.district,
|
41
|
+
address_city: data.address&.city&.city,
|
42
|
+
address_state_abbr: data.address&.city&.state&.state_abbr
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def me_client
|
49
|
+
@me_client ||= MeApi::Client.new(access_token)
|
50
|
+
end
|
20
51
|
end
|
21
52
|
end
|
@@ -9,10 +9,11 @@ module SolidusMe
|
|
9
9
|
{ name: "Jadlog .Com", carrier: "Jadlog", service_level: ".Com", external_id: 4 }
|
10
10
|
]
|
11
11
|
|
12
|
-
attr_accessor :package, :shipping_methods
|
12
|
+
attr_accessor :package, :shipping_methods, :me_account
|
13
13
|
def initialize(package, shipping_methods)
|
14
14
|
@package = package
|
15
15
|
@shipping_methods = shipping_methods
|
16
|
+
@me_account = Account.first
|
16
17
|
end
|
17
18
|
|
18
19
|
def self.generate_code external_id
|
@@ -35,11 +36,6 @@ module SolidusMe
|
|
35
36
|
end
|
36
37
|
|
37
38
|
def shipping_rates
|
38
|
-
@me_account = Account.first
|
39
|
-
return [] if @me_account.blank?
|
40
|
-
|
41
|
-
@me_account.check_token
|
42
|
-
@me_client = MeApi::Client.new(@me_account.access_token)
|
43
39
|
melhor_envio_rates = get_rates_from_melhor_envio(package)
|
44
40
|
shipping_rates = melhor_envio_rates.map do |melhor_envio_rate|
|
45
41
|
build_shipping_rate(melhor_envio_rate, package)
|
@@ -51,19 +47,35 @@ module SolidusMe
|
|
51
47
|
def insert_package_into_cart from
|
52
48
|
me_client = set_me_client
|
53
49
|
order = package.order
|
54
|
-
variants = order.variants
|
55
50
|
line_items = order.line_items
|
56
51
|
address = order.ship_address
|
57
52
|
dimensions = estimate_dimensions_from_package(package)
|
53
|
+
tax_id_from = cleaned_tax_id(@me_account.tax_id)
|
54
|
+
tax_id_to = cleaned_tax_id(order.tax_id)
|
58
55
|
|
59
56
|
shipping_method_name = @shipping_methods.sole.name
|
60
57
|
service_id = SHIPPING_METHODS.filter { _1[:name] == shipping_method_name }.sole[:external_id]
|
61
58
|
|
59
|
+
from = {
|
60
|
+
name: @me_account.name,
|
61
|
+
phone: @me_account.phone,
|
62
|
+
email: @me_account.email,
|
63
|
+
address: @me_account.address,
|
64
|
+
complement: @me_account.address_complement,
|
65
|
+
number: @me_account.address_number,
|
66
|
+
district: @me_account.address_district,
|
67
|
+
city: @me_account.address_city,
|
68
|
+
postal_code: @me_account.postal_code_from,
|
69
|
+
state_abbr: @me_account.address_state_abbr
|
70
|
+
}
|
71
|
+
|
72
|
+
document_key = tax_id_from.length == 11 ? :document : :company_document
|
73
|
+
from[document_key] = tax_id_from
|
74
|
+
|
62
75
|
to = {
|
63
76
|
name: address.name,
|
64
77
|
phone: address.phone,
|
65
78
|
email: order.email,
|
66
|
-
company_document: order.tax_id,
|
67
79
|
address: address.address1,
|
68
80
|
complement: address.address2,
|
69
81
|
number: address.number,
|
@@ -72,10 +84,12 @@ module SolidusMe
|
|
72
84
|
postal_code: address.zipcode,
|
73
85
|
state_abbr: address.state.abbr
|
74
86
|
}
|
87
|
+
|
88
|
+
document_key = tax_id_to.length == 11 ? :document : :company_document
|
89
|
+
to[document_key] = tax_id_to
|
75
90
|
|
76
|
-
products =
|
77
|
-
|
78
|
-
products << {
|
91
|
+
products = line_items.map do |line_item|
|
92
|
+
{
|
79
93
|
name: line_item.name,
|
80
94
|
quantity: line_item.quantity,
|
81
95
|
unitary_value: line_item.price
|
@@ -89,7 +103,11 @@ module SolidusMe
|
|
89
103
|
weight: package.weight / 1000
|
90
104
|
}]
|
91
105
|
|
92
|
-
|
106
|
+
options = {
|
107
|
+
insurance_value: order.total,
|
108
|
+
}
|
109
|
+
|
110
|
+
me_client.insert_package_into_cart(service_id:, from:, to:, products:, volumes:, options:)
|
93
111
|
end
|
94
112
|
|
95
113
|
def payment_ticket(ticket_id)
|
@@ -115,21 +133,25 @@ module SolidusMe
|
|
115
133
|
private
|
116
134
|
|
117
135
|
def set_me_client
|
118
|
-
|
119
|
-
return if me_account.blank?
|
136
|
+
return if @me_account.blank?
|
120
137
|
|
121
|
-
me_account.check_token
|
122
|
-
MeApi::Client.new(me_account.access_token)
|
138
|
+
@me_account.check_token
|
139
|
+
MeApi::Client.new(@me_account.access_token)
|
140
|
+
end
|
141
|
+
|
142
|
+
def cleaned_tax_id(tax_id)
|
143
|
+
tax_id.gsub(/\D/, "")
|
123
144
|
end
|
124
145
|
|
125
146
|
def get_rates_from_melhor_envio(package)
|
147
|
+
me_client = set_me_client
|
126
148
|
price = package.contents.map { |content| content.price }.sum
|
127
149
|
weight = package.weight
|
128
150
|
dimensions = estimate_dimensions_from_package(package)
|
129
151
|
|
130
152
|
zipcode = package.order.ship_address.zipcode
|
131
153
|
available_shipping_method_codes = @shipping_methods.pluck(:code)
|
132
|
-
rates =
|
154
|
+
rates = me_client.rates(
|
133
155
|
from: @me_account.postal_code_from,
|
134
156
|
to: zipcode,
|
135
157
|
weight_kg: (weight / 1000.00),
|
@@ -1,10 +1,50 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<% if params["action"] == 'edit' && me_account.access_token.present? %>
|
2
|
+
<%= form_with model: me_account, url: update_from_api_admin_solidus_me_account_url do |form| %>
|
3
|
+
<% form.hidden_field :account_id, value: me_account.id %>
|
4
|
+
<%= form.submit "Atualizar dados da conta a partir da API", class: 'btn btn-primary' %>
|
5
|
+
<% end %>
|
6
|
+
<% end %>
|
3
7
|
<%= form_with model: me_account, url: form_url do |form| %>
|
4
|
-
<fieldset class="no-border-
|
8
|
+
<fieldset class="no-border-bottom">
|
5
9
|
<legend>
|
6
10
|
Dados da Conta
|
7
11
|
</legend>
|
12
|
+
<div class="row">
|
13
|
+
<div class="col-12 col-md-6">
|
14
|
+
|
15
|
+
<%= form.field_container :name do %>
|
16
|
+
<%= form.label :name, "Nome", class: 'required' %>
|
17
|
+
<%= form.text_field :name, required: true, class: 'fullwidth' %>
|
18
|
+
<%= form.error_message_on :name %>
|
19
|
+
<% end %>
|
20
|
+
|
21
|
+
<%= form.field_container :tax_id do %>
|
22
|
+
<%= form.label :tax_id, "Documento", class: 'required' %>
|
23
|
+
<%= form.text_field :tax_id, required: true, class: 'fullwidth' %>
|
24
|
+
<%= form.error_message_on :tax_id %>
|
25
|
+
<% end %>
|
26
|
+
</div>
|
27
|
+
|
28
|
+
<div class="col-12 col-md-6">
|
29
|
+
|
30
|
+
<%= form.field_container :email do %>
|
31
|
+
<%= form.label :email, "E-mail", class: 'required' %>
|
32
|
+
<%= form.text_field :email, required: true, class: 'fullwidth' %>
|
33
|
+
<%= form.error_message_on :email %>
|
34
|
+
<% end %>
|
35
|
+
|
36
|
+
<%= form.field_container :phone do %>
|
37
|
+
<%= form.label :phone, "Telefone", class: 'required' %>
|
38
|
+
<%= form.text_field :phone, required: true, class: 'fullwidth' %>
|
39
|
+
<%= form.error_message_on :phone %>
|
40
|
+
<% end %>
|
41
|
+
|
42
|
+
</div>
|
43
|
+
</div>
|
44
|
+
</fieldset>
|
45
|
+
|
46
|
+
<fieldset class="no-border-bottom">
|
47
|
+
<legend>Endereço</legend>
|
8
48
|
<div class="row">
|
9
49
|
<div class="col-12 col-md-6">
|
10
50
|
|
@@ -14,6 +54,62 @@
|
|
14
54
|
<%= form.error_message_on :postal_code_from %>
|
15
55
|
<% end %>
|
16
56
|
|
57
|
+
</div>
|
58
|
+
</div>
|
59
|
+
<div class="row">
|
60
|
+
<div class="col-12 col-md-6">
|
61
|
+
<%= form.field_container :address do %>
|
62
|
+
<%= form.label :address, "Endereço", class: 'required' %>
|
63
|
+
<%= form.text_field :address, required: true, class: 'fullwidth' %>
|
64
|
+
<%= form.error_message_on :address %>
|
65
|
+
<% end %>
|
66
|
+
|
67
|
+
<%= form.field_container :address_number do %>
|
68
|
+
<%= form.label :address_number, "Número", class: 'required' %>
|
69
|
+
<%= form.text_field :address_number, required: true, class: 'fullwidth' %>
|
70
|
+
<%= form.error_message_on :address_number %>
|
71
|
+
<% end %>
|
72
|
+
|
73
|
+
<%= form.field_container :address_city do %>
|
74
|
+
<%= form.label :address_city, "Cidade", class: 'required' %>
|
75
|
+
<%= form.text_field :address_city, required: true, class: 'fullwidth' %>
|
76
|
+
<%= form.error_message_on :address_city %>
|
77
|
+
<% end %>
|
78
|
+
|
79
|
+
</div>
|
80
|
+
|
81
|
+
<div class="col-12 col-md-6">
|
82
|
+
<%= form.field_container :address_complement do %>
|
83
|
+
<%= form.label :address_complement, "Complemento" %>
|
84
|
+
<%= form.text_field :address_complement, class: 'fullwidth' %>
|
85
|
+
<%= form.error_message_on :address_complement %>
|
86
|
+
<% end %>
|
87
|
+
|
88
|
+
<%= form.field_container :address_district do %>
|
89
|
+
<%= form.label :address_district, "Bairro", class: 'required' %>
|
90
|
+
<%= form.text_field :address_district, required: true, class: 'fullwidth' %>
|
91
|
+
<%= form.error_message_on :address_district %>
|
92
|
+
<% end %>
|
93
|
+
|
94
|
+
<%= form.field_container :address_state_abbr do %>
|
95
|
+
<%= form.label :address_state_abbr, "Estado", class: 'required' %>
|
96
|
+
<%= form.text_field :address_state_abbr, required: true, class: 'fullwidth' %>
|
97
|
+
<%= form.error_message_on :address_state_abbr %>
|
98
|
+
<% end %>
|
99
|
+
|
100
|
+
</div>
|
101
|
+
</div>
|
102
|
+
</fieldset>
|
103
|
+
|
104
|
+
<fieldset>
|
105
|
+
<legend>
|
106
|
+
Aplicativo
|
107
|
+
</legend>
|
108
|
+
|
109
|
+
<%= render "link_auth", me_account: me_account %>
|
110
|
+
<div class="row">
|
111
|
+
<div class="col-12 col-md-6">
|
112
|
+
|
17
113
|
<%= form.field_container :services do %>
|
18
114
|
<%= form.label :services, "Serviços" %>
|
19
115
|
<%= form.text_field :services, class: 'fullwidth', disabled: true %>
|
@@ -73,14 +169,12 @@
|
|
73
169
|
</div>
|
74
170
|
</div>
|
75
171
|
</fieldset>
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
172
|
+
<div class="" style="margin-bottom: 60px;">
|
173
|
+
<div class="form-buttons filter-actions actions" data-hook="buttons">
|
174
|
+
<%= form.submit "Salvar", class: 'btn btn-primary' %>
|
175
|
+
<% if params["action"] == 'edit' %>
|
176
|
+
<%= link_to "Excluir", admin_solidus_me_account_path(me_account.id), method: :delete, data: { confirm: "Tem certeza que deseja excluir a conta?"}, class: 'button' %>
|
177
|
+
<% end %>
|
178
|
+
</div>
|
83
179
|
</div>
|
84
180
|
<% end %>
|
85
|
-
|
86
|
-
|
@@ -14,56 +14,122 @@
|
|
14
14
|
<% @accounts.each do |account| %>
|
15
15
|
<%= render "link_auth", me_account: account %>
|
16
16
|
|
17
|
-
<
|
18
|
-
<legend>
|
19
|
-
Dados da Conta
|
20
|
-
</legend>
|
21
|
-
<div class="row">
|
22
|
-
<div class="col-12 col-md-6">
|
23
|
-
<div class="field">
|
24
|
-
<%= label_tag :client_id, "Client ID" %>
|
25
|
-
<%= text_field_tag :client_id, account.client_id, class:"fullwidth", disabled: true %>
|
26
|
-
</div>
|
17
|
+
<div class="card" style="margin-bottom: 20px; border: 1px solid #ddd; border-radius: 4px;">
|
27
18
|
|
28
|
-
<div class="field">
|
29
|
-
<%= label_tag :client_secret, "Client Secret" %>
|
30
|
-
<%= text_field_tag :client_secret, account.client_secret, class:"fullwidth", disabled: true %>
|
31
|
-
</div>
|
32
19
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
20
|
+
<div class="card-body" style="padding: 20px;">
|
21
|
+
<fieldset class="no-border-bottom">
|
22
|
+
<legend>
|
23
|
+
Informações da Conta
|
24
|
+
</legend>
|
25
|
+
<div class="row">
|
26
|
+
<div class="col-12 col-md-6">
|
27
|
+
<div class="field">
|
28
|
+
<%= label_tag :name, "Nome" %>
|
29
|
+
<%= text_field_tag :name, account.name.presence || "Não informado", class:"fullwidth", disabled: true %>
|
30
|
+
</div>
|
37
31
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
32
|
+
<div class="field">
|
33
|
+
<%= label_tag :email, "E-mail" %>
|
34
|
+
<%= text_field_tag :email, account.email.presence || "Não informado", class:"fullwidth", disabled: true %>
|
35
|
+
</div>
|
36
|
+
|
37
|
+
<div class="field">
|
38
|
+
<%= label_tag :phone, "Telefone" %>
|
39
|
+
<%= text_field_tag :phone, account.phone.presence || "Não informado", class:"fullwidth", disabled: true %>
|
40
|
+
</div>
|
42
41
|
</div>
|
43
|
-
</div>
|
44
|
-
</div>
|
45
42
|
|
46
|
-
|
43
|
+
<div class="col-12 col-md-6">
|
44
|
+
<div class="field">
|
45
|
+
<%= label_tag :tax_id, "CPF/CNPJ" %>
|
46
|
+
<%= text_field_tag :tax_id, account.tax_id.presence || "Não informado", class:"fullwidth", disabled: true %>
|
47
|
+
</div>
|
48
|
+
|
49
|
+
<div class="field">
|
50
|
+
<%= label_tag :postal_code_from, "CEP de Origem" %>
|
51
|
+
<%= text_field_tag :postal_code_from, account.postal_code_from.presence || "Não informado", class:"fullwidth", disabled: true %>
|
52
|
+
</div>
|
47
53
|
|
48
|
-
|
49
|
-
|
50
|
-
|
54
|
+
<div class="field">
|
55
|
+
<%= label_tag :address_full, "Endereço" %>
|
56
|
+
<% address_parts = [account.address, account.address_number].compact %>
|
57
|
+
<% address_display = if address_parts.any? %>
|
58
|
+
<% address_text = address_parts.join(", ") %>
|
59
|
+
<% address_text += ", #{account.address_complement}" if account.address_complement.present? %>
|
60
|
+
<% district_city_state = [account.address_district, account.address_city, account.address_state_abbr].compact %>
|
61
|
+
<% address_text += ", #{district_city_state.join(", ")}" if district_city_state.any? %>
|
62
|
+
<% address_text %>
|
63
|
+
<% else %>
|
64
|
+
<% "Não informado" %>
|
65
|
+
<% end %>
|
66
|
+
<%= text_area_tag :address_full, address_display, class:"fullwidth", disabled: true, rows: 3 %>
|
67
|
+
</div>
|
68
|
+
</div>
|
51
69
|
</div>
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
70
|
+
</fieldset>
|
71
|
+
|
72
|
+
<fieldset class="no-border-bottom">
|
73
|
+
<legend>
|
74
|
+
Configurações da API
|
75
|
+
</legend>
|
76
|
+
<div class="row">
|
77
|
+
<div class="col-12 col-md-6">
|
78
|
+
<div class="field">
|
79
|
+
<%= label_tag :client_id, "Client ID" %>
|
80
|
+
<%= text_field_tag :client_id, account.client_id, class:"fullwidth", disabled: true %>
|
81
|
+
</div>
|
82
|
+
|
83
|
+
<div class="field">
|
84
|
+
<%= label_tag :redirect_url, "Redirect URL" %>
|
85
|
+
<%= text_field_tag :redirect_url, account.redirect_url, class:"fullwidth", disabled: true %>
|
86
|
+
</div>
|
87
|
+
|
88
|
+
<div class="field">
|
89
|
+
<%= label_tag :refresh_token, "Refresh Token" %>
|
90
|
+
<%= text_field_tag :refresh_token, account.refresh_token, class:"fullwidth", disabled: true %>
|
91
|
+
</div>
|
92
|
+
</div>
|
93
|
+
|
94
|
+
<div class="col-12 col-md-6">
|
95
|
+
<div class="field">
|
96
|
+
<%= label_tag :access_token, "Access Token" %>
|
97
|
+
<%= text_field_tag :access_token, account.access_token, class:"fullwidth", disabled: true %>
|
98
|
+
</div>
|
99
|
+
|
100
|
+
<div class="field">
|
101
|
+
<%= label_tag :token_expires_in, "Token Expira em" %>
|
102
|
+
<% token_display = if account.token_expires_in.present? %>
|
103
|
+
<% token_text = account.token_expires_in.strftime("%d/%m/%Y às %H:%M") %>
|
104
|
+
<% if account.token_expires_in < Time.current %>
|
105
|
+
<% token_text += " (Expirado)" %>
|
106
|
+
<% elsif account.token_expires_in < 1.day.from_now %>
|
107
|
+
<% token_text += " (Expira em breve)" %>
|
108
|
+
<% else %>
|
109
|
+
<% token_text += " (Válido)" %>
|
110
|
+
<% end %>
|
111
|
+
<% token_text %>
|
112
|
+
<% else %>
|
113
|
+
<% "Não informado" %>
|
114
|
+
<% end %>
|
115
|
+
<%= text_field_tag :token_expires_in, token_display, class:"fullwidth", disabled: true %>
|
116
|
+
</div>
|
117
|
+
|
118
|
+
<div class="field">
|
119
|
+
<%= label_tag :state, "State" %>
|
120
|
+
<%= text_field_tag :state, account.state || "Não definido", class:"fullwidth", disabled: true %>
|
121
|
+
</div>
|
122
|
+
</div>
|
56
123
|
</div>
|
124
|
+
</fieldset>
|
125
|
+
</div>
|
57
126
|
|
58
|
-
|
59
|
-
|
60
|
-
<%=
|
127
|
+
<div class="card-footer" style="background-color: #f5f5f5; padding: 15px; border-top: 1px solid #ddd;">
|
128
|
+
<div class="form-buttons filter-actions actions" data-hook="buttons">
|
129
|
+
<%= link_to "Editar", edit_admin_solidus_me_account_path(account.id), class: 'btn btn-primary' %>
|
130
|
+
<%= link_to "Excluir", admin_solidus_me_account_path(account.id), method: :delete, data: { confirm: "Tem certeza que deseja excluir a conta?"}, class: 'btn btn-danger', style: 'margin-left: 10px;' %>
|
61
131
|
</div>
|
62
132
|
</div>
|
63
|
-
</fieldset>
|
64
|
-
<div class="form-buttons filter-actions actions" data-hook="buttons">
|
65
|
-
<%= link_to "Editar", edit_admin_solidus_me_account_path(account.id), class: 'btn btn-primary' %>
|
66
|
-
<%= link_to "Excluir", admin_solidus_me_account_path(account.id), method: :delete, data: { confirm: "Tem certeza que deseja excluir a conta?"}, class: 'button' %>
|
67
133
|
</div>
|
68
134
|
<% end %>
|
69
135
|
</div>
|
data/config/routes.rb
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
class AddColumnsToMeAccount < ActiveRecord::Migration[7.1]
|
2
|
+
def change
|
3
|
+
add_column :solidus_me_accounts, :name, :string
|
4
|
+
add_column :solidus_me_accounts, :email, :string
|
5
|
+
add_column :solidus_me_accounts, :tax_id, :string
|
6
|
+
add_column :solidus_me_accounts, :phone, :string
|
7
|
+
add_column :solidus_me_accounts, :address, :string
|
8
|
+
add_column :solidus_me_accounts, :address_complement, :string
|
9
|
+
add_column :solidus_me_accounts, :address_number, :string
|
10
|
+
add_column :solidus_me_accounts, :address_district, :string
|
11
|
+
add_column :solidus_me_accounts, :address_city, :string
|
12
|
+
add_column :solidus_me_accounts, :address_state_abbr, :string
|
13
|
+
end
|
14
|
+
end
|
data/lib/solidus_me/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solidus_me
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hamilton Tumenas Borges
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date:
|
10
|
+
date: 2025-07-31 00:00:00.000000000 Z
|
11
11
|
dependencies:
|
12
12
|
- !ruby/object:Gem::Dependency
|
13
13
|
name: me_api
|
@@ -15,14 +15,14 @@ dependencies:
|
|
15
15
|
requirements:
|
16
16
|
- - ">="
|
17
17
|
- !ruby/object:Gem::Version
|
18
|
-
version:
|
18
|
+
version: 2.3.0
|
19
19
|
type: :runtime
|
20
20
|
prerelease: false
|
21
21
|
version_requirements: !ruby/object:Gem::Requirement
|
22
22
|
requirements:
|
23
23
|
- - ">="
|
24
24
|
- !ruby/object:Gem::Version
|
25
|
-
version:
|
25
|
+
version: 2.3.0
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: solidus_brazilian_adaptations
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
@@ -61,7 +61,6 @@ files:
|
|
61
61
|
- app/controller/spree/admin/solidus_me/accounts_controller.rb
|
62
62
|
- app/models/solidus_me/account.rb
|
63
63
|
- app/models/solidus_me/melhor_envio.rb
|
64
|
-
- app/models/solidus_me/shipping_estimator.rb
|
65
64
|
- app/views/spree/admin/solidus_me/accounts/_form.html.erb
|
66
65
|
- app/views/spree/admin/solidus_me/accounts/_link_auth.html.erb
|
67
66
|
- app/views/spree/admin/solidus_me/accounts/edit.html.erb
|
@@ -70,6 +69,7 @@ files:
|
|
70
69
|
- config/locales/pt-BR.yml
|
71
70
|
- config/routes.rb
|
72
71
|
- db/migrate/20231109124213_create_solidus_me_accounts.rb
|
72
|
+
- db/migrate/20250731123741_add_columns_to_me_account.rb
|
73
73
|
- lib/generators/solidus_me/install/install_generator.rb
|
74
74
|
- lib/generators/solidus_me/install/templates/initializer.rb
|
75
75
|
- lib/solidus_me.rb
|
@@ -94,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
94
|
- !ruby/object:Gem::Version
|
95
95
|
version: '0'
|
96
96
|
requirements: []
|
97
|
-
rubygems_version: 3.6.
|
97
|
+
rubygems_version: 3.6.2
|
98
98
|
specification_version: 4
|
99
99
|
summary: Gem para integração com a API do Melhor Envio
|
100
100
|
test_files: []
|
@@ -1,96 +0,0 @@
|
|
1
|
-
module SolidusMe
|
2
|
-
class ShippingEstimator
|
3
|
-
def shipping_rates(package, _frontend_only = true)
|
4
|
-
@me_account = Account.first
|
5
|
-
return [build_shipping_rate(default_rate, package)] if @me_account.blank?
|
6
|
-
|
7
|
-
@me_account.check_token
|
8
|
-
@me_client = MeApi::Client.new(@me_account.access_token)
|
9
|
-
|
10
|
-
melhor_envio_rates = get_rates_from_melhor_envio(package)
|
11
|
-
shipping_rates = melhor_envio_rates.map do |melhor_envio_rate|
|
12
|
-
build_shipping_rate(melhor_envio_rate, package)
|
13
|
-
end
|
14
|
-
|
15
|
-
unless shipping_rates.empty?
|
16
|
-
default_shipping_rate = Spree::Config.shipping_rate_selector_class.new(shipping_rates).find_default
|
17
|
-
default_shipping_rate.selected = true
|
18
|
-
end
|
19
|
-
|
20
|
-
shipping_rates
|
21
|
-
end
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
def get_rates_from_melhor_envio(package)
|
26
|
-
price = package.contents.map { |content| content.price }.sum
|
27
|
-
weight = package.weight
|
28
|
-
|
29
|
-
variants = package.contents.map { |content| content.variant }
|
30
|
-
height_cm = height(variants)
|
31
|
-
width_cm = width(variants)
|
32
|
-
length_cm = length(variants)
|
33
|
-
|
34
|
-
zipcode = package.order.ship_address.zipcode
|
35
|
-
services = @me_account.services.presence || ["SEDEX", "PAC", "Mini Envios", ".Package",
|
36
|
-
".Com"]
|
37
|
-
|
38
|
-
rates = @me_client.rates(
|
39
|
-
from: @me_account.postal_code_from,
|
40
|
-
to: zipcode,
|
41
|
-
weight_kg: (weight / 1000.00),
|
42
|
-
contents_value_brl: price
|
43
|
-
)
|
44
|
-
rates.select { |rate| rate.price > 0 && services.include?(rate.service_name) }
|
45
|
-
rescue StandardError
|
46
|
-
[default_rate]
|
47
|
-
end
|
48
|
-
|
49
|
-
def build_shipping_rate(melhor_envio_rate, package)
|
50
|
-
shipping_method = Spree::ShippingMethod.find_or_create_by(
|
51
|
-
carrier: melhor_envio_rate.carrier_name,
|
52
|
-
service_level: melhor_envio_rate.service_name
|
53
|
-
) do |shipping_method|
|
54
|
-
shipping_method.name = "#{melhor_envio_rate.carrier_name} #{melhor_envio_rate.service_name}"
|
55
|
-
shipping_method.calculator = Spree::Calculator::Shipping::FlatRate.create
|
56
|
-
shipping_method.shipping_categories = Spree::ShippingCategory.all
|
57
|
-
shipping_method.available_to_users = true
|
58
|
-
end
|
59
|
-
estimate_prose = "Chegará em até #{ActionController::Base.helpers.pluralize(melhor_envio_rate.max_delivery_time,
|
60
|
-
'dia', plural: 'dias')} úteis"
|
61
|
-
|
62
|
-
Spree::ShippingRate.new(
|
63
|
-
shipment: package.shipment,
|
64
|
-
shipping_method: shipping_method,
|
65
|
-
cost: melhor_envio_rate.price,
|
66
|
-
min_delivery_time: melhor_envio_rate.min_delivery_time.business_days.from_now,
|
67
|
-
max_delivery_time: melhor_envio_rate.max_delivery_time.business_days.from_now,
|
68
|
-
estimate_prose: estimate_prose,
|
69
|
-
expires_in: Time.now + 2.hours
|
70
|
-
)
|
71
|
-
end
|
72
|
-
|
73
|
-
def default_rate
|
74
|
-
default_rate = Data.define(:price, :service_name, :carrier_name, :min_delivery_time, :max_delivery_time)
|
75
|
-
default_rate.new(
|
76
|
-
price: 15.00,
|
77
|
-
service_name: "",
|
78
|
-
carrier_name: "Frete padrão",
|
79
|
-
min_delivery_time: 5,
|
80
|
-
max_delivery_time: 7,
|
81
|
-
)
|
82
|
-
end
|
83
|
-
|
84
|
-
def height(variants)
|
85
|
-
variants.pluck(:height, :width, :depth).map(&:max).compact.max
|
86
|
-
end
|
87
|
-
|
88
|
-
def width(variants)
|
89
|
-
variants.pluck(:height, :width, :depth).map { |dimensions| dimensions.sort[1] }.compact.max
|
90
|
-
end
|
91
|
-
|
92
|
-
def length(variants)
|
93
|
-
variants.pluck(:height, :width, :depth).map(&:min).compact.sum
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|