solidus_me 3.5.3 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3b72c2c52871e1ef2d347f656462d22a808eeda08e279c689d60863277abd38a
4
- data.tar.gz: 516e63f72d30e2c78a760048397d770e4fe8320c907bfc95a1d2185a002b66f0
3
+ metadata.gz: c1f7124426c0b227f783eafc7c7fdd1deda02e76d91a9b8ae6fce7e6eb97d8d1
4
+ data.tar.gz: f293dbcab591dc6df18ad5f2e7d1f9155829691b22ed5450690d36221ba3c284
5
5
  SHA512:
6
- metadata.gz: f6dababc0fae4b2ba7d8764f042073bd9ef198e2d71fe641389c3cf4a98ac3bb11f36b63d52f1fe973f47331dc4dc15e3ed05e5d8926626bc1cac000673e0460
7
- data.tar.gz: b95e2f25ea5a0ac7aa574c656ba8708c58a6282b5933544bf7527da97b7625a3d8b05ecfde2afca4cd9cda7a76cdf7fa60faf85b12243da215a1f7aa2ee0e620
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,15 +47,31 @@ 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)
58
- tax_id = order.tax_id.gsub(/\D/, "")
53
+ tax_id_from = cleaned_tax_id(@me_account.tax_id)
54
+ tax_id_to = cleaned_tax_id(order.tax_id)
59
55
 
60
56
  shipping_method_name = @shipping_methods.sole.name
61
57
  service_id = SHIPPING_METHODS.filter { _1[:name] == shipping_method_name }.sole[:external_id]
62
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
+
63
75
  to = {
64
76
  name: address.name,
65
77
  phone: address.phone,
@@ -72,12 +84,12 @@ module SolidusMe
72
84
  postal_code: address.zipcode,
73
85
  state_abbr: address.state.abbr
74
86
  }
75
- document_key = tax_id.length == 11 ? :document : :company_document
76
- to[document_key] = tax_id
87
+
88
+ document_key = tax_id_to.length == 11 ? :document : :company_document
89
+ to[document_key] = tax_id_to
77
90
 
78
- products = []
79
- line_items.each do |line_item|
80
- products << {
91
+ products = line_items.map do |line_item|
92
+ {
81
93
  name: line_item.name,
82
94
  quantity: line_item.quantity,
83
95
  unitary_value: line_item.price
@@ -121,21 +133,25 @@ module SolidusMe
121
133
  private
122
134
 
123
135
  def set_me_client
124
- me_account = Account.first
125
- return if me_account.blank?
136
+ return if @me_account.blank?
126
137
 
127
- me_account.check_token
128
- 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/, "")
129
144
  end
130
145
 
131
146
  def get_rates_from_melhor_envio(package)
147
+ me_client = set_me_client
132
148
  price = package.contents.map { |content| content.price }.sum
133
149
  weight = package.weight
134
150
  dimensions = estimate_dimensions_from_package(package)
135
151
 
136
152
  zipcode = package.order.ship_address.zipcode
137
153
  available_shipping_method_codes = @shipping_methods.pluck(:code)
138
- rates = @me_client.rates(
154
+ rates = me_client.rates(
139
155
  from: @me_account.postal_code_from,
140
156
  to: zipcode,
141
157
  weight_kg: (weight / 1000.00),
@@ -1,10 +1,50 @@
1
- <%= render "link_auth", me_account: me_account %>
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-top">
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
- <div class="form-buttons filter-actions actions" data-hook="buttons">
79
- <%= form.submit "Salvar", class: 'btn btn-primary' %>
80
- <% if params["action"] == 'edit' %>
81
- <%= link_to "Excluir", admin_solidus_me_account_path(me_account.id), method: :delete, data: { confirm: "Tem certeza que deseja excluir a conta?"}, class: 'button' %>
82
- <% end %>
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
- <fieldset class="no-border-top">
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
- <div class="field">
34
- <%= label_tag :refresh_token, "Refresh Token" %>
35
- <%= text_field_tag :refresh_token, account.refresh_token, class:"fullwidth", disabled: true %>
36
- </div>
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
- <div class="field">
39
- <%= label_tag :token_expires_in, "Token Expiration" %>
40
- <div class="fullwidth" id="token_expires_in" name="token_expires_in">
41
- <%= account.token_expires_in %>
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
- <div class="col-12 col-md-6">
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
- <div class="field">
49
- <%= label_tag :redirect_url, "Redirect URL" %>
50
- <%= text_field_tag :redirect_url, account.redirect_url, class:"fullwidth", disabled: true %>
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
- <div class="field">
54
- <%= label_tag :state, "State" %>
55
- <%= text_field_tag :state, account.state, class:"fullwidth", disabled: true %>
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
- <div class="field">
59
- <%= label_tag :access_token, "Access Token" %>
60
- <%= text_field_tag :access_token, account.access_token, class:"fullwidth", disabled: true %>
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
@@ -5,6 +5,7 @@ Spree::Core::Engine.routes.draw do
5
5
  namespace :solidus_me do
6
6
  resources :accounts do
7
7
  get "authorize", on: :collection
8
+ patch "update_from_api", on: :member, as: :update_from_api
8
9
  end
9
10
  end
10
11
  end
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SolidusMe
4
- VERSION = "3.5.3"
4
+ VERSION = "3.6.0"
5
5
  end
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.5.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: 1980-01-02 00:00:00.000000000 Z
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: '0'
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: '0'
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.9
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