bling_api 1.0.3 → 2.0.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: f58164e91badf85963b7bbf81e5274b61617e204697c7b1a4e718486789df5ef
4
- data.tar.gz: 7c774ce59034b265e4da0272e2991df3bc1cd131d88eae34a3fc3c61d03c3975
3
+ metadata.gz: 8c36554ff0861c3cd2467333b5085abf0c3a8ab06a720dd6e184e7aaf107843d
4
+ data.tar.gz: b1cf370a7297d9fd8cb6b93c33c959a299c6850c545e501f6622715e9fd4a003
5
5
  SHA512:
6
- metadata.gz: 7226d6c04e21c636984e5bfe83b6e26bbba52c34c02ad515253aaa4fd10d6a249d8fd29ef02673bdd6322946e2b0671345ee7bcdc3351b3447fca192d1775e11
7
- data.tar.gz: 2b431d57a85d4013a7451742656491a1a0aec2618dd673c5b5518bbc4e8a7ce27712f229571011d712e899ff35c4028d3283fcb2b890a1eceb1189ace1065621
6
+ metadata.gz: 36d40b1644b4bc370673a66b90018a10593d8481787fa7458c301d72ef0609df5996c47b144561b3d21d4984017413d901d6199f441c8e21c2b5c973e27b8b54
7
+ data.tar.gz: 34171555cd7c7a60e54e4013b8b27195aebc932ef91441cb6f482129a805916015c551b743cd367e53cbbc9f42eabd3bb71348883f2350adb106b0a48578d97e
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- bling_api (1.0.3)
4
+ bling_api (2.0.0)
5
5
  ac
6
6
  base64
7
7
 
@@ -3,71 +3,298 @@ module BlingApi
3
3
  BASE_URL = "https://www.bling.com.br/Api/v3"
4
4
  SAVE_RESPONSES = true
5
5
 
6
- attr_reader :access_token
7
- def initialize(access_token = nil)
8
- @headers = {
9
- "Content-Type": "application/json"
6
+ def initialize(client_id:, client_secret:, refresh_token: nil, access_token: nil, token_expires_at: nil)
7
+ @client_id = client_id
8
+ @client_secret = client_secret
9
+ @refresh_token = refresh_token
10
+ @access_token = access_token
11
+ @token_expires_at = token_expires_at
12
+ end
13
+
14
+ def refresh_token
15
+ headers = {
16
+ "Content-Type" => "application/x-www-form-urlencoded",
17
+ "Authorization" => "Basic #{Base64.strict_encode64("#{@client_id}:#{@client_secret}")}"
10
18
  }
11
- super(access_token)
19
+ body = "grant_type=refresh_token&refresh_token=#{@refresh_token}"
20
+ response = post("/oauth/token", body:, headers:, skip_authentication: true)
21
+ @access_token = response.access_token
22
+ @refresh_token = response.refresh_token
23
+ @token_expires_at = Time.now + response.expires_in
12
24
  end
13
25
 
14
- def update_contact(contact_id, body)
15
- put("/contatos/#{contact_id}", body: body, headers: @headers) { |response| validate_response(response, "") }
26
+ def authorize(code:)
27
+ headers = {
28
+ "Content-Type" => "application/x-www-form-urlencoded",
29
+ "Authorization" => "Basic #{Base64.strict_encode64("#{@client_id}:#{@client_secret}")}"
30
+ }
31
+ body = "grant_type=authorization_code&code=#{code}"
32
+ response = post("/oauth/token", body:, headers:, skip_authentication: true)
33
+ @access_token = response.access_token
34
+ @refresh_token = response.refresh_token
35
+ @token_expires_at = Time.now + response.expires_in
16
36
  end
17
37
 
18
- def get_order(order_id)
19
- response = get("/pedidos/vendas/#{order_id}") { |response| validate_response(response, "data") }
20
- response.json["data"]
38
+ def get_refresh_token
39
+ @refresh_token
21
40
  end
22
41
 
23
- def get_contact(contact_id)
24
- response = get("/contatos/#{contact_id}") { |response| validate_response(response, "data") }
25
- response.json["data"]
42
+ def update_contact(
43
+ id:,
44
+ nome: nil,
45
+ pessoa_juridica: nil,
46
+ numero_documento: nil,
47
+ situacao: nil,
48
+ codigo: nil,
49
+ rg: nil,
50
+ orgao_emissor: nil,
51
+ telefone: nil,
52
+ celular: nil,
53
+ email: nil,
54
+ endereco: nil,
55
+ endereco_cep: nil,
56
+ endereco_bairro: nil,
57
+ endereco_municipio: nil,
58
+ endereco_uf: nil,
59
+ endereco_numero: nil,
60
+ endereco_complemento: nil,
61
+ endereco_cob: nil,
62
+ endereco_cob_cep: nil,
63
+ endereco_cob_bairro: nil,
64
+ endereco_cob_municipio: nil,
65
+ endereco_cob_uf: nil,
66
+ endereco_cob_numero: nil,
67
+ endereco_cob_complemento: nil,
68
+ cod_contribuinte: nil,
69
+ ie: nil,
70
+ fantasia: nil,
71
+ limite_credito: nil,
72
+ condicao_pagamento: nil,
73
+ financeiro_categoria_id: nil,
74
+ pais: nil,
75
+ tipos_contato: nil,
76
+ pessoas_contato: nil,
77
+ id_vendedor: nil,
78
+ dados_adicionais: nil
79
+ )
80
+ contact = get_contact(id).data
81
+ body = {
82
+ nome: nome || contact.nome,
83
+ telefone: telefone ? telefone.gsub(/^\+55/, "") : contact.telefone,
84
+ celular: celular ? celular.gsub(/^\+55/, "") : contact.celular,
85
+ codigo: codigo || contact.codigo,
86
+ tipo: pessoa_juridica ? pessoa_juridica ? "J" : "F" : contact.tipo,
87
+ indicadorIe: cod_contribuinte || contact.indicadorIe,
88
+ ie: ie || contact.ie,
89
+ numeroDocumento: numero_documento || contact.numeroDocumento,
90
+ orgaoEmissor: orgao_emissor || contact.orgaoEmissor,
91
+ rg: rg || contact.rg,
92
+ fantasia: fantasia || contact.fantasia,
93
+ email: email || contact.email,
94
+ situacao: situacao || contact.situacao,
95
+ vendedor: {
96
+ id: id_vendedor || contact.vendedor.id,
97
+ },
98
+ dadosAdicionais: dados_adicionais || contact.dadosAdicionais,
99
+ pais: pais || contact.pais,
100
+ tiposContato: tipos_contato || contact.tiposContato,
101
+ pessoasContato: pessoas_contato || contact.pessoasContato,
102
+ financeiro: {
103
+ limite_credito: limite_credito || contact.financeiro.limiteCredito,
104
+ condicao_pagamento: condicao_pagamento || contact.financeiro.condicaoPagamento,
105
+ categoria: {
106
+ id: financeiro_categoria_id || contact.financeiro.categoria.id
107
+ }
108
+ },
109
+ endereco: {
110
+ geral: {
111
+ endereco: endereco || contact.endereco.geral.endereco,
112
+ cep: endereco_cep || contact.endereco.geral.cep,
113
+ bairro: endereco_bairro || contact.endereco.geral.bairro,
114
+ municipio: endereco_municipio || contact.endereco.geral.municipio,
115
+ uf: endereco_uf || contact.endereco.geral.uf,
116
+ numero: endereco_numero || contact.endereco.geral.numero,
117
+ complemento: endereco_complemento || contact.endereco.geral.complemento
118
+ },
119
+ cobranca: {
120
+ endereco: endereco_cob || contact.endereco.geral.endereco,
121
+ cep: endereco_cob_cep || contact.endereco.geral.cep,
122
+ bairro: endereco_cob_bairro || contact.endereco.geral.bairro,
123
+ municipio: endereco_cob_municipio || contact.endereco.geral.municipio,
124
+ uf: endereco_cob_uf || contact.endereco.geral.uf,
125
+ numero: endereco_cob_numero || contact.endereco.geral.numero,
126
+ complemento: endereco_cob_complemento || contact.endereco.geral.complemento
127
+ }
128
+ }
129
+ }
130
+ put("/contatos/#{id}", body: body)
26
131
  end
27
132
 
28
- def get_seller(seller_id)
29
- response = get("/vendedores/#{seller_id}") { |response| validate_response(response, "data") }
30
- response.json["data"]
133
+ def get_order(id)
134
+ get("/pedidos/vendas/#{id}") { _1.data }
31
135
  end
32
136
 
33
- def get_sellers(page, limit, situation)
34
- response = get("/vendedores?pagina=#{page}&limite=#{limit}&situacaoContato=#{situation}") { |response| validate_response(response, "data") }
35
- response.json["data"]
137
+ def get_contact(id)
138
+ get("/contatos/#{id}") { _1.data }
36
139
  end
37
140
 
38
- def find_contact_by_document_number(document_number)
39
- response = get("/contatos?numeroDocumento=#{document_number.gsub(/\D/, "")}") { |response| validate_response(response, "data") }
40
- response.json["data"].first
141
+ def get_seller(id)
142
+ get("/vendedores/#{id}") { _1.data }
41
143
  end
42
144
 
43
- def find_product_by_sku(sku)
44
- response = get("/produtos?codigo=#{sku}") { |response| validate_response(response, "data") }
45
- response.json["data"].first
145
+ def get_sellers(page, limit, situation)
146
+ get("/vendedores?pagina=#{page}&limite=#{limit}&situacaoContato=#{situation}") { _1.data }
46
147
  end
47
148
 
48
- def create_contact(body)
49
- response = post("/contatos", body: body, headers: @headers) { |response| validate_response(response, "data") }
50
- response.json["data"]
149
+ def find_contact_by_document_number(document_number)
150
+ get("/contatos?numeroDocumento=#{document_number.gsub(/\D/, "")}") { _1.data }
51
151
  end
52
152
 
53
- def create_order(body)
54
- response = post("/pedidos/vendas", body: body, headers: @headers) { |response| validate_response(response, "data") }
55
- response.json["data"]
153
+ def find_product_by_sku(sku)
154
+ get("/produtos?codigo=#{sku}") { _1.data }
56
155
  end
57
156
 
58
- def refresh_token(client_id:, client_secret:, refresh_token:)
59
- headers = {
60
- "Content-Type": "application/x-www-form-urlencoded",
61
- Authorization: "Basic #{Base64.strict_encode64("#{client_id}:#{client_secret}")}"
157
+ def create_contact(
158
+ nome:,
159
+ pessoa_juridica:,
160
+ numero_documento:,
161
+ situacao:,
162
+ codigo: nil,
163
+ rg: nil,
164
+ orgao_emissor: nil,
165
+ id: nil,
166
+ telefone: nil,
167
+ celular: "",
168
+ email: "",
169
+ endereco: nil,
170
+ endereco_cep: nil,
171
+ endereco_bairro: nil,
172
+ endereco_municipio: nil,
173
+ endereco_uf: nil,
174
+ endereco_numero: nil,
175
+ endereco_complemento: nil,
176
+ endereco_cob: nil,
177
+ endereco_cob_cep: nil,
178
+ endereco_cob_bairro: nil,
179
+ endereco_cob_municipio: nil,
180
+ endereco_cob_uf: nil,
181
+ endereco_cob_numero: nil,
182
+ endereco_cob_complemento: nil,
183
+ cod_contribuinte: nil,
184
+ ie: nil,
185
+ fantasia: nil,
186
+ limite_credito: nil,
187
+ condicao_pagamento: nil,
188
+ financeiro_categoria_id: nil,
189
+ pais: nil,
190
+ tipos_contato: nil,
191
+ pessoas_contato: nil,
192
+ vendedor: nil,
193
+ dados_adicionais: nil
194
+ )
195
+ body = {
196
+ nome: nome,
197
+ tipo: pessoa_juridica ? "J" : "F",
198
+ numeroDocumento: numero_documento,
199
+ situacao: situacao,
200
+ codigo: codigo,
201
+ telefone: telefone.gsub(/^\+55/, ""),
202
+ celular: celular.gsub(/^\+55/, ""),
203
+ indicadorIe: cod_contribuinte,
204
+ ie: ie,
205
+ orgaoEmissor: orgao_emissor,
206
+ rg: rg,
207
+ fantasia: fantasia,
208
+ email: email,
209
+ vendedor: vendedor,
210
+ dadosAdicionais: dados_adicionais,
211
+ pais: pais,
212
+ tiposContato: tipos_contato,
213
+ pessoasContato: pessoas_contato,
214
+ financeiro: {
215
+ limite_credito: limite_credito,
216
+ condicao_pagamento: condicao_pagamento,
217
+ categoria: {
218
+ id: financeiro_categoria_id
219
+ }
220
+ },
221
+ endereco: {
222
+ geral: {
223
+ endereco: endereco,
224
+ cep: endereco_cep,
225
+ bairro: endereco_bairro,
226
+ municipio: endereco_municipio,
227
+ uf: endereco_uf,
228
+ numero: endereco_numero,
229
+ complemento: endereco_complemento
230
+ },
231
+ cobranca: {
232
+ endereco: endereco_cob,
233
+ cep: endereco_cob_cep,
234
+ bairro: endereco_cob_bairro,
235
+ municipio: endereco_cob_municipio,
236
+ uf: endereco_cob_uf,
237
+ numero: endereco_cob_numero,
238
+ complemento: endereco_cob_complemento
239
+ }
240
+ }
62
241
  }
63
- body = "grant_type=refresh_token&refresh_token=#{refresh_token}"
64
- response = post("/oauth/token", body: body, headers: headers) { |response| validate_response(response, "refresh_token") }
65
- response.json
242
+ post("/contatos", body: body) { _1.data }
66
243
  end
67
244
 
68
- def validate_response(response, required_response_key)
69
- puts response.json unless response.success?
70
- ![500, 429].include?(response.code) || response.json.dig(*required_response_key)
245
+ # @param itens [Array<BlingApi::Item>] Array de objetos Item contendo codigo, id_produto, quantidade, valor, unidade, desconto, aliquota_ipi, descricao, descricao_detalhada, comissao_base, comissao_aliquota, comissao_valor
246
+ # @param parcelas [Array<BlingApi::Installment>] Array de objetos Installment contendo id_forma_pagamento, valor, data_vencimento, observacoes, id
247
+ # @param transporte [<BlingApi::Shipment>] Objeto Shipment contendo valor_frete, frete_por_conta, quantidade_volumes, nome_transportadora, nome_etiqueta, endereco, numero, complemento, municipio, uf, bairro, cep, pais, nome_servico, codigo_rastreio
248
+ # @param numero_venda É o número do pedido de venda no Bling
249
+ # @param numero_pedido É o número do pedido na loja virtual ou marketplace, exemplo: R123456
250
+ def create_order(
251
+ data:,
252
+ id_contato:,
253
+ itens:,
254
+ numero_venda: nil,
255
+ numero_pedido: nil,
256
+ id_loja: nil,
257
+ id_vendedor: nil,
258
+ pessoa_juridica: nil,
259
+ numero_documento: nil,
260
+ parcelas: [],
261
+ id_categoria_receita: nil,
262
+ observacoes: "",
263
+ observacoes_internas: "",
264
+ valor_desconto: 0,
265
+ numero_pedido_compra: nil,
266
+ transporte: nil
267
+ )
268
+ body = {
269
+ numero: numero_venda,
270
+ numeroLoja: numero_pedido,
271
+ data: data,
272
+ loja: {
273
+ id: id_loja
274
+ },
275
+ contato: {
276
+ id: id_contato,
277
+ tipoPessoa: pessoa_juridica ? "J" : "F",
278
+ numeroDocumento: numero_documento
279
+ },
280
+ itens: itens.map(&:to_api_hash),
281
+ vendedor: {
282
+ id: id_vendedor
283
+ },
284
+ categoria: {
285
+ id: id_categoria_receita
286
+ },
287
+ parcelas: parcelas.map(&:to_api_hash),
288
+ transporte: transporte&.to_api_hash,
289
+ desconto: {
290
+ valor: valor_desconto,
291
+ unidade: "REAL"
292
+ },
293
+ observacoes: observacoes,
294
+ observacoesInternas: observacoes_internas,
295
+ numeroPedidoCompra: numero_pedido_compra
296
+ }
297
+ post("/pedidos/vendas", body: body) { _1.data }
71
298
  end
72
299
  end
73
300
  end
@@ -0,0 +1,25 @@
1
+ module BlingApi
2
+ class Installment
3
+
4
+ attr_reader :id_forma_pagamento, :valor, :data_vencimento, :observacoes, :id
5
+ def initialize(id_forma_pagamento:, valor:, data_vencimento:, observacoes: "", id: nil)
6
+ @id_forma_pagamento = id_forma_pagamento
7
+ @valor = valor
8
+ @data_vencimento = data_vencimento
9
+ @observacoes = observacoes
10
+ @id = id
11
+ end
12
+
13
+ def to_api_hash
14
+ {
15
+ id: id,
16
+ dataVencimento: data_vencimento,
17
+ valor: valor,
18
+ observacoes: observacoes,
19
+ formaPagamento: {
20
+ id: id_forma_pagamento
21
+ }
22
+ }
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,41 @@
1
+ module BlingApi
2
+ class Item
3
+
4
+ attr_reader :codigo, :id_produto, :quantidade, :valor, :unidade, :desconto, :aliquota_ipi, :descricao, :descricao_detalhada, :comissao_base, :comissao_aliquota, :comissao_valor
5
+ def initialize(id_produto:, codigo:, quantidade:, valor:, unidade: nil, desconto: nil, aliquota_ipi: nil, descricao: nil, descricao_detalhada: nil, comissao_base: nil, comissao_aliquota: nil, comissao_valor: nil)
6
+ @codigo = codigo
7
+ @id_produto = id_produto
8
+ @quantidade = quantidade
9
+ @valor = valor
10
+ @unidade = unidade
11
+ @desconto = desconto
12
+ @aliquota_ipi = aliquota_ipi
13
+ @descricao = descricao
14
+ @descricao_detalhada = descricao_detalhada
15
+ @comissao_base = comissao_base
16
+ @comissao_aliquota = comissao_aliquota
17
+ @comissao_valor = comissao_valor
18
+ end
19
+
20
+ def to_api_hash
21
+ {
22
+ codigo: codigo,
23
+ unidade: unidade,
24
+ quantidade: quantidade,
25
+ desconto: desconto,
26
+ valor: valor,
27
+ aliquotaIPI: aliquota_ipi,
28
+ descricao: descricao,
29
+ descricao_detalhada: descricao_detalhada,
30
+ produto: {
31
+ id: id_produto
32
+ },
33
+ comissao: {
34
+ base: comissao_base,
35
+ aliquota: comissao_aliquota,
36
+ valor: comissao_valor
37
+ }
38
+ }
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,52 @@
1
+ module BlingApi
2
+ class Shipment
3
+ attr_reader :valor_frete, :frete_por_conta, :quantidade_volumes, :peso_bruto_kg, :nome_transportadora, :nome_etiqueta, :endereco, :numero, :complemento, :municipio, :uf, :bairro, :cep, :pais, :nome_servico, :codigo_rastreio
4
+ def initialize(valor_frete:, nome_transportadora:, frete_por_conta: nil, quantidade_volumes: nil, peso_bruto_kg: nil, nome_etiqueta: nil, endereco: nil, numero: nil, complemento: nil, municipio: nil, uf: nil, bairro: nil, cep: nil, pais: nil, nome_servico: nil, codigo_rastreio: nil)
5
+ @valor_frete = valor_frete
6
+ @frete_por_conta = frete_por_conta
7
+ @quantidade_volumes = quantidade_volumes
8
+ @peso_bruto_kg = peso_bruto_kg
9
+ @nome_transportadora = nome_transportadora
10
+ @nome_etiqueta = nome_etiqueta
11
+ @endereco = endereco
12
+ @numero = numero
13
+ @complemento = complemento
14
+ @municipio = municipio
15
+ @uf = uf
16
+ @bairro = bairro
17
+ @cep = cep
18
+ @pais = pais
19
+ @nome_servico = nome_servico
20
+ @codigo_rastreio = codigo_rastreio
21
+ end
22
+
23
+ def to_api_hash
24
+ {
25
+ fretePorConta: frete_por_conta,
26
+ frete: valor_frete,
27
+ quantidadeVolumes: quantidade_volumes,
28
+ pesoBruto: peso_bruto_kg,
29
+ contato: {
30
+ nome: nome_transportadora
31
+ },
32
+ etiqueta: {
33
+ nome: nome_etiqueta,
34
+ endereco: endereco,
35
+ numero: numero,
36
+ complemento: complemento,
37
+ municipio: municipio,
38
+ uf: uf,
39
+ bairro: bairro,
40
+ cep: cep,
41
+ nomePais: pais
42
+ },
43
+ volumes: [
44
+ {
45
+ servico: nome_servico,
46
+ codigoRastreamento: codigo_rastreio
47
+ }
48
+ ]
49
+ }
50
+ end
51
+ end
52
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module BlingApi
4
- VERSION = "1.0.3"
4
+ VERSION = "2.0.0"
5
5
  end
data/lib/bling_api.rb CHANGED
@@ -5,10 +5,13 @@ require "base64"
5
5
  require "active_support/core_ext/hash/indifferent_access"
6
6
  require_relative "bling_api/version"
7
7
  require_relative "bling_api/client"
8
- require_relative "bling_api/customer"
9
- require_relative "bling_api/order"
10
- require_relative "bling_api/product"
11
- require_relative "bling_api/seller"
8
+ # require_relative "bling_api/customer" # Deixamos de usar
9
+ # require_relative "bling_api/order" # Deixamos de usar
10
+ # require_relative "bling_api/product" # Deixamos de usar
11
+ # require_relative "bling_api/seller" # Deixamos de usar
12
+ require_relative "bling_api/item"
13
+ require_relative "bling_api/installment"
14
+ require_relative "bling_api/shipment"
12
15
 
13
16
  module BlingApi
14
17
  class Error < StandardError; end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bling_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - caio
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-06-04 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: ac
@@ -51,9 +51,12 @@ files:
51
51
  - lib/bling_api.rb
52
52
  - lib/bling_api/client.rb
53
53
  - lib/bling_api/customer.rb
54
+ - lib/bling_api/installment.rb
55
+ - lib/bling_api/item.rb
54
56
  - lib/bling_api/order.rb
55
57
  - lib/bling_api/product.rb
56
58
  - lib/bling_api/seller.rb
59
+ - lib/bling_api/shipment.rb
57
60
  - lib/bling_api/version.rb
58
61
  - lib/generators/bling_api/install/install_generator.rb
59
62
  - lib/generators/bling_api/install/templates/initializer.rb
@@ -77,7 +80,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
77
80
  - !ruby/object:Gem::Version
78
81
  version: '0'
79
82
  requirements: []
80
- rubygems_version: 3.6.2
83
+ rubygems_version: 3.6.9
81
84
  specification_version: 4
82
85
  summary: ''
83
86
  test_files: []