tiny_erp_api 1.0.0 → 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: 0e30fb0ea25eb461c8f30fbcfadf024060ab30133c4e6ffcfcc5efe4f2ed4475
4
- data.tar.gz: ea1fe6ea157cc34ef811ddd62f73b391e31fe9dc80d3cd98a6ee19a3e9a3052a
3
+ metadata.gz: b1aa38b1b932ac49ac8edeca5403ef4cc67d75198d770a461dab5776e9d730bd
4
+ data.tar.gz: 5819c0e66ccf3d38455ab2a7252f75e8c25d8a8669e0af5112efee42acd20a36
5
5
  SHA512:
6
- metadata.gz: a0ef8b128ade2d05457ba54abbd8620be21476ecde589b55e4475763596f87c027bbd00f48e4000946c0c12d6ed34ef71bbe3ae673f6317a83db5b9711b676ed
7
- data.tar.gz: 5441effde03400cbb2d2bd5382ba882b6f934afcaca333791006db4e384f37732c2eb5ac12df79376d2263707b0901ed2c513ed3a0f6732055c9f1da9c913533
6
+ metadata.gz: 5348c57b25c31b4a8623fef29e06341c7885a3d0445e125b574fa2de1bde288494baa3b046d4c0cd42104446314e3e88697f45ca64cf6e068dc3f858976a0b53
7
+ data.tar.gz: 23c22ac1c35ab92800e921485b02b80ed0facff84c9db06fb4e5429b583b10f73e47e876f6186c6101b22e182b84b0214448d81471589fe76eb99ac11b0a0d07
data/README.md CHANGED
@@ -1,39 +1,104 @@
1
1
  # TinyErpApi
2
2
 
3
- TODO: Delete this and the text below, and describe your gem
4
-
5
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/tiny_erp_api`. To experiment with that code, run `bin/console` for an interactive prompt.
6
-
7
- ## Installation
8
-
9
- TODO: Replace `UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG` with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.
10
-
11
- Install the gem and add to the application's Gemfile by executing:
12
-
13
- $ bundle add UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
14
-
15
- If bundler is not being used to manage dependencies, install the gem by executing:
16
-
17
- $ gem install UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
18
-
19
- ## Usage
20
-
21
- TODO: Write usage instructions here
22
-
23
- ## Development
24
-
25
- After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
26
-
27
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
28
-
29
- ## Contributing
30
-
31
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/tiny_erp_api. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/[USERNAME]/tiny_erp_api/blob/main/CODE_OF_CONDUCT.md).
32
-
33
- ## License
34
-
35
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
36
-
37
- ## Code of Conduct
38
-
39
- Everyone interacting in the TinyErpApi project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/tiny_erp_api/blob/main/CODE_OF_CONDUCT.md).
3
+ Wrapper de integração com a API 2.0 do ERP Tiny.
4
+
5
+ [Documentação API Tiny](https://tiny.com.br/api-docs/api2)
6
+
7
+ ### Funcionalidades:
8
+ - Clientes: find_by_id, find_by_document (CPF/CNPJ)
9
+ - Pedido de venda: create, find_by_id
10
+ - Produtos: find_by_sku, get_product_by_id
11
+ - Vendedores: get_all (listagem), find_by_name
12
+
13
+ ## Instalação
14
+
15
+ Adicionar tiny_erp_api no Gemfile:
16
+
17
+ ```ruby
18
+ gem 'tiny_erp_api'
19
+ ```
20
+ ou
21
+ ```shell
22
+ bundle add tiny_erp_api
23
+ ```
24
+
25
+ Instalar a gem:
26
+
27
+ ```shell
28
+ bin/rails generate tiny_erp_api:install
29
+ ```
30
+
31
+ ## Uso
32
+
33
+ Configurar `access_token` no initializer ou direto no código:
34
+ ```ruby
35
+ TinyErpApi.configure do |config|
36
+ config.access_token = "ACCESS_TOKEN"
37
+ end
38
+ ```
39
+
40
+ ### Exemplo
41
+ #### Produto
42
+ ```ruby
43
+ # Encontrar um produto a partir do SKU
44
+ product = TinyErpApi::Product.find_by_sku("123456")
45
+ puts product.sku # "123456"
46
+ ```
47
+ #### Pedido de venda
48
+ ```ruby
49
+ # Instancia o objeto
50
+ order = TinyErpApi::Order.new(
51
+ data_pedido: "05/06/2024",
52
+ numero_pedido: "R123456",
53
+ ecommerce: "Site",
54
+ atualizar_cliente: true,
55
+ cliente: {
56
+ nome: "João da Silva",
57
+ tipo_pessoa: "F",
58
+ cpf_cnpj: "12345678901",
59
+ endereco: "Rua da Saudade",
60
+ numero: "123",
61
+ complemento: "",
62
+ bairro: "Centro",
63
+ cep: "01002010",
64
+ cidade: "São Paulo",
65
+ uf: "SP",
66
+ fone: "1122334455",
67
+ email: "joao@email.com"
68
+ },
69
+ itens:[
70
+ {
71
+ item: {
72
+ codigo: "123321",
73
+ quantidade: 1,
74
+ valor_unitario: 10.00,
75
+ }
76
+ }
77
+ ],
78
+ forma_pagamento: "credito",
79
+ parcelas: [
80
+ {
81
+ parcela: {
82
+ data: "05/06/2024",
83
+ valor: 10.00,
84
+ forma_pagamento: "credito",
85
+ }
86
+ }
87
+ ],
88
+ valor_frete: 5.00,
89
+ valor_desconto: 5.0,
90
+ forma_envio: "Correios",
91
+ forma_frete: "SEDEX",
92
+ transportador: "LOGISTICA LTDA.",
93
+ id_vendedor: 23523434,
94
+ deposito: "Geral",
95
+ id_natureza_operacao: 45617653,
96
+ observacoes: "observações",
97
+ observacoes_internas: "observações internas"
98
+ )
99
+
100
+ # Cria o pedido de venda
101
+ created_order = order.create
102
+
103
+ puts created_order.numero # 102030
104
+ ```
@@ -0,0 +1,37 @@
1
+ module TinyErpApi
2
+ class Address
3
+
4
+ attr_reader :endereco, :endereco_numero, :complemento, :bairro, :municipio, :cep, :uf, :fone, :nome_destinatario, :cpf_cnpj, :tipo_pessoa, :ie
5
+ def initialize(endereco:, uf:, endereco_numero: nil, complemento: nil, bairro: nil, municipio: nil, cep: nil, fone: nil, nome_destinatario: nil, cpf_cnpj: nil, tipo_pessoa: nil, ie: nil)
6
+ @endereco = endereco
7
+ @endereco_numero = endereco_numero
8
+ @complemento = complemento
9
+ @bairro = bairro
10
+ @municipio = municipio
11
+ @cep = cep
12
+ @uf = uf
13
+ @fone = fone
14
+ @nome_destinatario = nome_destinatario
15
+ @cpf_cnpj = cpf_cnpj
16
+ @tipo_pessoa = tipo_pessoa
17
+ @ie = ie
18
+ end
19
+
20
+ def to_api_hash
21
+ {
22
+ endereco: endereco,
23
+ enderecoNro: endereco_numero,
24
+ complemento: complemento,
25
+ bairro: bairro,
26
+ municipio: municipio,
27
+ cep: cep,
28
+ uf: uf,
29
+ fone: fone,
30
+ nomeDestinatario: nome_destinatario,
31
+ cpfCnpj: cpf_cnpj,
32
+ tipoPessoa: tipo_pessoa,
33
+ ie: ie
34
+ }
35
+ end
36
+ end
37
+ end
@@ -1,78 +1,411 @@
1
1
  module TinyErpApi
2
2
  class Client < Ac::Base
3
- BASE_URL = "https://api.tiny.com.br/api2"
4
- attr_reader :access_token, :query_params
3
+ BASE_URL = "https://api.tiny.com.br/public-api/v3"
4
+ SAVE_RESPONSES = true
5
5
 
6
- def initialize(access_token = nil)
7
- @access_token = access_token || TinyErpApi.configuration.access_token
8
- @query_params = "token=#{@access_token}&formato=JSON"
9
- super()
6
+ def initialize(client_id:, client_secret:, refresh: nil, access_token: nil, token_expires_at: nil)
7
+ @client_id = client_id
8
+ @client_secret = client_secret
9
+ @refresh = refresh
10
+ @access_token = access_token
11
+ @token_expires_at = token_expires_at
12
+ end
13
+
14
+ def refresh_token
15
+ body = {
16
+ grant_type: "refresh_token",
17
+ client_id: @client_id,
18
+ client_secret: @client_secret,
19
+ refresh_token: @refresh
20
+ }
21
+ headers = {
22
+ "Accept" => "application/json",
23
+ "Content-Type" => "application/x-www-form-urlencoded"
24
+ }
25
+ response = post("https://accounts.tiny.com.br/realms/tiny/protocol/openid-connect/token", body:, headers:, skip_authentication: true)
26
+ @access_token = response.access_token
27
+ @refresh = response.refresh_token
28
+ @token_expires_at = Time.now + response.expires_in
29
+ end
30
+
31
+ def authorize(code:, redirect_url:)
32
+ body = {
33
+ grant_type: 'authorization_code',
34
+ client_id: @client_id,
35
+ client_secret: @client_secret,
36
+ redirect_uri: redirect_url,
37
+ code: code
38
+ }
39
+ headers = {
40
+ "Accept" => "application/json",
41
+ "Content-Type" => "application/x-www-form-urlencoded"
42
+ }
43
+ response = post("https://accounts.tiny.com.br/realms/tiny/protocol/openid-connect/token", body:, headers:, skip_authentication: true)
44
+ @access_token = response.access_token
45
+ @refresh = response.refresh_token
46
+ @token_expires_at = Time.now + response.expires_in
47
+ end
48
+
49
+ def default_options
50
+ {
51
+ headers: {
52
+ "Accept" => "application/json",
53
+ "Content-Type" => "application/json"
54
+ }
55
+ }
56
+ end
57
+
58
+ def get_refresh_token
59
+ @refresh
10
60
  end
11
61
 
12
62
  # Contacts
13
- def get_contact_by_document(document_number)
14
- params = "#{@query_params}&cnpj_cpf=#{document_number}"
15
- response = get("/contatos.pesquisa.php?#{params}")
16
- response.json.dig("retorno","contatos",0,"contato")
63
+ def find_contact_by_document(document_number)
64
+ get("/contatos?cpfCnpj=#{document_number}")
65
+ end
66
+
67
+ def get_contact(id)
68
+ get("/contatos/#{id}") { _1.id }
17
69
  end
18
70
 
19
- def get_contact_by_id(contact_id)
20
- params = "#{@query_params}&id=#{contact_id}"
21
- response = get("/contato.obter.php?#{params}")
22
- response.json.dig("retorno","contato")
71
+ def create_contact(
72
+ nome:,
73
+ tipo_pessoa:,
74
+ codigo: nil,
75
+ fantasia: nil,
76
+ cpf_cnpj: nil,
77
+ inscricao_estadual: nil,
78
+ rg: nil,
79
+ telefone: nil,
80
+ celular: nil,
81
+ email: nil,
82
+ endereco: nil,
83
+ endereco_numero: nil,
84
+ endereco_complemento: nil,
85
+ endereco_bairro: nil,
86
+ endereco_municipio: nil,
87
+ endereco_cep: nil,
88
+ endereco_uf: nil,
89
+ endereco_pais: nil,
90
+ endereco_cobranca: nil,
91
+ endereco_cobranca_numero: nil,
92
+ endereco_cobranca_complemento: nil,
93
+ endereco_cobranca_bairro: nil,
94
+ endereco_cobranca_municipio: nil,
95
+ endereco_cobranca_cep: nil,
96
+ endereco_cobranca_uf: nil,
97
+ endereco_cobranca_pais: nil,
98
+ inscricao_municipal: nil,
99
+ telefone_adicional: nil,
100
+ email_nfe: nil,
101
+ site: nil,
102
+ regime_tributario: nil,
103
+ estado_civil: nil,
104
+ profissao: nil,
105
+ sexo: nil,
106
+ data_nascimento: nil,
107
+ naturalidade: nil,
108
+ nome_pai: nil,
109
+ nome_mae: nil,
110
+ cpf_pai: nil,
111
+ cpf_mae: nil,
112
+ limite_credito: nil,
113
+ situacao: nil,
114
+ observacoes: nil,
115
+ vendedor_id: nil,
116
+ tipos: nil,
117
+ contatos: nil
118
+ )
119
+ body = {
120
+ nome: nome,
121
+ codigo: codigo,
122
+ fantasia: fantasia,
123
+ tipoPessoa: tipo_pessoa,
124
+ cpfCnpj: cpf_cnpj,
125
+ inscricaoEstadual: inscricao_estadual,
126
+ rg: rg,
127
+ telefone: telefone,
128
+ celular: celular,
129
+ email: email,
130
+ endereco: {
131
+ endereco: endereco,
132
+ numero: endereco_numero,
133
+ complemento: endereco_complemento,
134
+ bairro: endereco_bairro,
135
+ municipio: endereco_municipio,
136
+ cep: endereco_cep,
137
+ uf: endereco_uf,
138
+ pais: endereco_pais
139
+ },
140
+ enderecoCobranca: {
141
+ endereco: endereco_cobranca,
142
+ numero: endereco_cobranca_numero,
143
+ complemento: endereco_cobranca_complemento,
144
+ bairro: endereco_cobranca_bairro,
145
+ municipio: endereco_cobranca_municipio,
146
+ cep: endereco_cobranca_cep,
147
+ uf: endereco_cobranca_uf,
148
+ pais: endereco_cobranca_pais
149
+ },
150
+ inscricaoMunicipal: inscricao_municipal,
151
+ telefoneAdicional: telefone_adicional,
152
+ emailNfe: email_nfe,
153
+ site: site,
154
+ regimeTributario: regime_tributario,
155
+ estadoCivil: estado_civil,
156
+ profissao: profissao,
157
+ sexo: sexo,
158
+ dataNascimento: data_nascimento,
159
+ naturalidade: naturalidade,
160
+ nomePai: nome_pai,
161
+ nomeMae: nome_mae,
162
+ cpfPai: cpf_pai,
163
+ cpfMae: cpf_mae,
164
+ limiteCredito: limite_credito,
165
+ situacao: situacao,
166
+ observacoes: observacoes,
167
+ vendedor: vendedor_id.present? ? { id: vendedor_id } : nil,
168
+ tipos: tipos,
169
+ contatos: contatos
170
+ }.compact
171
+ post("/contatos", body:)
23
172
  end
24
173
 
25
- def create_contact(contact)
26
- params = "#{@query_params}&contato=#{URI.encode_www_form_component(contact.to_json)}"
27
- response = post("/contato.incluir.php?#{params}")
28
- response.json.dig("retorno","registros",0,"registro")
174
+ def update_contact(
175
+ id:,
176
+ nome: nil,
177
+ codigo: nil,
178
+ fantasia: nil,
179
+ tipo_pessoa: nil,
180
+ cpf_cnpj: nil,
181
+ inscricao_estadual: nil,
182
+ rg: nil,
183
+ telefone: nil,
184
+ celular: nil,
185
+ email: nil,
186
+ endereco: nil,
187
+ endereco_numero: nil,
188
+ endereco_complemento: nil,
189
+ endereco_bairro: nil,
190
+ endereco_municipio: nil,
191
+ endereco_cep: nil,
192
+ endereco_uf: nil,
193
+ endereco_pais: nil,
194
+ endereco_cobranca: nil,
195
+ endereco_cobranca_numero: nil,
196
+ endereco_cobranca_complemento: nil,
197
+ endereco_cobranca_bairro: nil,
198
+ endereco_cobranca_municipio: nil,
199
+ endereco_cobranca_cep: nil,
200
+ endereco_cobranca_uf: nil,
201
+ endereco_cobranca_pais: nil,
202
+ inscricao_municipal: nil,
203
+ telefone_adicional: nil,
204
+ email_nfe: nil,
205
+ site: nil,
206
+ regime_tributario: nil,
207
+ estado_civil: nil,
208
+ profissao: nil,
209
+ sexo: nil,
210
+ data_nascimento: nil,
211
+ naturalidade: nil,
212
+ nome_pai: nil,
213
+ nome_mae: nil,
214
+ cpf_pai: nil,
215
+ cpf_mae: nil,
216
+ limite_credito: nil,
217
+ situacao: nil,
218
+ observacoes: nil,
219
+ vendedor_id: nil,
220
+ tipos: nil,
221
+ contatos: nil
222
+ )
223
+ contact = get_contact(id)
224
+ body = {
225
+ nome: nome || contact.nome,
226
+ codigo: codigo || contact.codigo,
227
+ fantasia: fantasia || contact.fantasia,
228
+ tipoPessoa: tipo_pessoa || contact.tipoPessoa,
229
+ cpfCnpj: cpf_cnpj || contact.cpfCnpj,
230
+ inscricaoEstadual: inscricao_estadual || contact.inscricaoEstadual,
231
+ rg: rg || contact.rg,
232
+ telefone: telefone || contact.telefone,
233
+ celular: celular || contact.celular,
234
+ email: email || contact.email,
235
+ endereco: {
236
+ endereco: endereco || contact.endereco&.endereco,
237
+ numero: endereco_numero || contact.endereco&.numero,
238
+ complemento: endereco_complemento || contact.endereco&.complemento,
239
+ bairro: endereco_bairro || contact.endereco&.bairro,
240
+ municipio: endereco_municipio || contact.endereco&.municipio,
241
+ cep: endereco_cep || contact.endereco&.cep,
242
+ uf: endereco_uf || contact.endereco&.uf,
243
+ pais: endereco_pais || contact.endereco&.pais
244
+ },
245
+ enderecoCobranca: {
246
+ endereco: endereco_cobranca || contact.enderecoCobranca&.endereco,
247
+ numero: endereco_cobranca_numero || contact.enderecoCobranca&.numero,
248
+ complemento: endereco_cobranca_complemento || contact.enderecoCobranca&.complemento,
249
+ bairro: endereco_cobranca_bairro || contact.enderecoCobranca&.bairro,
250
+ municipio: endereco_cobranca_municipio || contact.enderecoCobranca&.municipio,
251
+ cep: endereco_cobranca_cep || contact.enderecoCobranca&.cep,
252
+ uf: endereco_cobranca_uf || contact.enderecoCobranca&.uf,
253
+ pais: endereco_cobranca_pais || contact.enderecoCobranca&.pais
254
+ },
255
+ inscricaoMunicipal: inscricao_municipal || contact.inscricaoMunicipal,
256
+ telefoneAdicional: telefone_adicional || contact.telefoneAdicional,
257
+ emailNfe: email_nfe || contact.emailNfe,
258
+ site: site || contact.site,
259
+ regimeTributario: regime_tributario || contact.regimeTributario.zero? ? nil : contact.regimeTributario,
260
+ estadoCivil: estado_civil || contact.estadoCivil,
261
+ profissao: profissao || contact.profissao,
262
+ sexo: sexo || contact.sexo.empty? ? nil : contact.sexo,
263
+ dataNascimento: data_nascimento || contact.dataNascimento,
264
+ naturalidade: naturalidade || contact.naturalidade,
265
+ nomePai: nome_pai || contact.nomePai,
266
+ nomeMae: nome_mae || contact.nomeMae,
267
+ cpfPai: cpf_pai || contact.cpfPai,
268
+ cpfMae: cpf_mae || contact.cpfMae,
269
+ limiteCredito: limite_credito || contact.limiteCredito.zero? ? nil : contact.limiteCredito,
270
+ situacao: situacao || contact.situacao,
271
+ observacoes: observacoes || contact.observacoes,
272
+ vendedor: (vendedor_id.present? ? { id: vendedor_id } : nil) || contact.vendedor,
273
+ tipos: tipos || contact.tipos.map(&:id),
274
+ contatos: contatos || contact.contatos
275
+ }
276
+ put("/contatos/#{id}", body:)
29
277
  end
30
278
 
31
- def update_contact(contact_id)
32
- params = "#{@query_params}&contato=#{contact_id}"
33
- response = post("/contato.alterar.php?#{params}")
34
- response.json.dig("retorno","registros",0,"registro")
279
+ def get_contact_types
280
+ get("/contatos/tipos")
281
+ end
282
+
283
+ def contact_types_to_integer(types)
284
+ contact_types = get_contact_types.itens.index_by(&:id)
285
+ tipos = types.map do |type|
286
+ contact_types[type.id].perfilContato.to_i
287
+ end
288
+ tipos
35
289
  end
36
290
 
37
291
  # Sellers
38
- def get_sellers(page = 1)
39
- params = "#{@query_params}&pagina=#{page}pesquisa="
40
- response = post("/vendedores.pesquisa.php?#{params}")
41
- response.json.dig("retorno")
292
+ def get_sellers(limit = 100, offset = 0)
293
+ get("/vendedores?limit=#{limit}&offset=#{offset}")
42
294
  end
43
295
 
44
296
  def get_seller_by_name(seller_name)
45
- params = "#{@query_params}&pesquisa=#{URI.encode_www_form_component(seller_name)}"
46
- response = post("/vendedores.pesquisa.php?#{params}")
47
- response.json.dig("retorno","vendedores",0,"vendedor")
297
+ get("/vendedores?nome=#{URI.encode_www_form_component(seller_name)}")
48
298
  end
49
299
 
50
300
  # Products
51
301
  def get_product_by_sku(sku)
52
- params = "#{@query_params}&pesquisa=#{URI.encode_www_form_component(sku)}"
53
- response = post("/produtos.pesquisa.php?#{params}")
54
- response.json.dig("retorno","produtos",0, "produto")
302
+ get("/produtos?codigo=#{URI.encode_www_form_component(sku)}")
55
303
  end
56
304
 
57
305
  def get_product_by_id(product_id)
58
- params = "#{@query_params}&id=#{product_id}"
59
- response = post("/produto.obter.php?#{params}")
60
- response.json.dig("retorno", "produto")
306
+ get("/produtos/#{product_id}")
61
307
  end
62
308
 
63
309
  # Orders
64
310
  def get_order_by_id(order_id)
65
- params = "#{@query_params}&id=#{order_id}"
66
- response = post("/pedido.obter.php?#{params}")
67
- response.json.dig("retorno", "pedido")
311
+ get("/pedidos/#{order_id}")
68
312
  end
69
313
 
70
- def create_order(order)
71
- params = "#{@query_params}&pedido=#{URI.encode_www_form_component(JSON.dump(order))}"
72
- response = post("/pedido.incluir.php?#{params}")
73
- response.json.dig("retorno", "registros", "registro")
314
+ # @param itens [Array<TinyErpApi::Item>] Array de objetos Item
315
+ # @param endereco_entrega [<TinyErpApi::Address>] Objeto Address
316
+ # @param transportador [<TinyErpApi::Shipment>] Objeto Shipment
317
+ # @param parcelas [<TinyErpApi::Installment>] Array de objetos Installment
318
+ # @param pagamentos_integrados [<TinyErpApi::IntegratedPayment>] Array de objetos IntegratedPayment
319
+ def create_order(
320
+ data:,
321
+ id_contato:,
322
+ itens:,
323
+ data_prevista: nil,
324
+ data_envio: nil,
325
+ observacoes: nil,
326
+ observacoes_internas: nil,
327
+ situacao: nil,
328
+ data_entrega: nil,
329
+ numero_ordem_compra: nil,
330
+ valor_desconto: nil,
331
+ valor_frete: nil,
332
+ valor_outras_despesas: nil,
333
+ id_lista_preco: nil,
334
+ id_natureza_operacao: nil,
335
+ id_vendedor: nil,
336
+ endereco_entrega: nil,
337
+ cpfCnpj_consumidor_final: nil,
338
+ cliente_consumidor_final: nil,
339
+ id_ecommerce: nil,
340
+ numero_pedido_ecommerce: nil,
341
+ transportador: nil,
342
+ id_intermediador: nil,
343
+ id_deposito: nil,
344
+ pagamento_forma_recebimento: nil,
345
+ pagamento_meio_pagamento: nil,
346
+ parcelas: [],
347
+ pagamentos_integrados: []
348
+ )
349
+ body = {
350
+ data: data,
351
+ idContato: id_contato,
352
+ itens: itens.map(&:to_api_hash),
353
+ dataPrevista: data_prevista,
354
+ dataEnvio: data_envio,
355
+ observacoes: observacoes,
356
+ observacoesInternas: observacoes_internas,
357
+ situacao: situacao,
358
+ dataEntrega: data_entrega,
359
+ numeroOrdemCompra: numero_ordem_compra,
360
+ valorDesconto: valor_desconto,
361
+ valorFrete: valor_frete,
362
+ valorOutrasDespesas: valor_outras_despesas,
363
+ listaPreco: {
364
+ id: id_lista_preco
365
+ },
366
+ naturezaOperacao: {
367
+ id: id_natureza_operacao
368
+ },
369
+ vendedor: {
370
+ id: id_vendedor
371
+ },
372
+ enderecoEntrega: endereco_entrega&.to_api_hash,
373
+ consumidorFinal: {
374
+ cpfCnpj: cpfCnpj_consumidor_final,
375
+ clienteConsumidorFinal: cliente_consumidor_final
376
+ },
377
+ ecommerce: {
378
+ id: id_ecommerce,
379
+ numeroPedidoEcommerce: numero_pedido_ecommerce
380
+ },
381
+ transportador: transportador&.to_api_hash,
382
+ intermediador: {
383
+ id: id_intermediador
384
+ },
385
+ deposito: {
386
+ id: id_deposito
387
+ },
388
+ pagamento: {
389
+ formaRecebimento: {
390
+ id: pagamento_forma_recebimento
391
+ },
392
+ meioPagamento: {
393
+ id: pagamento_meio_pagamento
394
+ },
395
+ parcelas: parcelas.map(&:to_api_hash)
396
+ },
397
+ pagamentosIntegrados: pagamentos_integrados.map(&:to_api_hash),
398
+ }
399
+ post("/pedidos", body: deep_compact(body))
74
400
  end
75
401
 
402
+ # A API não aceita campos nulos, então precisamos remover recursivamente os campos que são nil ou hashes vazias
403
+ def deep_compact(hash)
404
+ hash.each_with_object({}) do |(k, v), new_hash|
405
+ v = deep_compact(v) if v.is_a?(Hash)
76
406
 
407
+ new_hash[k] = v unless v.nil? || (v.is_a?(Hash) && v.empty?)
408
+ end
409
+ end
77
410
  end
78
411
  end
@@ -45,14 +45,6 @@ module TinyErpApi
45
45
  new(**build_hash(contact))
46
46
  end
47
47
 
48
- def self.create(params)
49
-
50
- end
51
-
52
- def self.update(params)
53
-
54
- end
55
-
56
48
  def self.build_hash(json_response)
57
49
  {
58
50
  id: json_response["id"],
@@ -0,0 +1,29 @@
1
+ module TinyErpApi
2
+ class Installment
3
+
4
+ attr_reader :dias, :data, :valor, :observacoes, :id_forma_recebimento, :id_meio_pagamento
5
+ def initialize(dias: nil, data: nil, valor: nil, observacoes: nil, id_forma_recebimento: nil, id_meio_pagamento: nil)
6
+ @dias = dias
7
+ @data = data
8
+ @valor = valor
9
+ @observacoes = observacoes
10
+ @id_forma_recebimento = id_forma_recebimento
11
+ @id_meio_pagamento = id_meio_pagamento
12
+ end
13
+
14
+ def to_api_hash
15
+ {
16
+ dias: dias,
17
+ data: data,
18
+ valor: valor,
19
+ observacoes: observacoes,
20
+ formaRecebimento: {
21
+ id: id_forma_recebimento
22
+ },
23
+ meioPagamento: {
24
+ id: id_meio_pagamento
25
+ }
26
+ }
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ module TinyErpApi
2
+ class IntegratedPayment
3
+
4
+ attr_reader :valor, :tipoPagamento, :cnpjIntermediador, :codigoAutorizacao, :codigoBandeira
5
+ def initialize(valor: nil, tipoPagamento: nil, cnpjIntermediador: nil, codigoAutorizacao: nil, codigoBandeira: nil)
6
+ @valor = valor
7
+ @tipoPagamento = tipoPagamento
8
+ @cnpjIntermediador = cnpjIntermediador
9
+ @codigoAutorizacao = codigoAutorizacao
10
+ @codigoBandeira = codigoBandeira
11
+ end
12
+
13
+ def to_api_hash
14
+ {
15
+ valor: valor,
16
+ tipoPagamento: tipoPagamento,
17
+ cnpjIntermediador: cnpjIntermediador,
18
+ codigoAutorizacao: codigoAutorizacao,
19
+ codigoBandeira: codigoBandeira
20
+ }
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ module TinyErpApi
2
+ class Item
3
+
4
+ attr_reader :id_produto, :tipo, :quantidade, :valor_unitario, :info_adicional
5
+ def initialize(id_produto:, tipo:, quantidade:, valor_unitario:, info_adicional: nil)
6
+ @id_produto = id_produto
7
+ @tipo = tipo
8
+ @quantidade = quantidade
9
+ @valor_unitario = valor_unitario
10
+ @info_adicional = info_adicional
11
+ end
12
+
13
+ def to_api_hash
14
+ {
15
+ produto: {
16
+ id: id_produto,
17
+ tipo: tipo, # "P" para produto, "S" para serviço
18
+ },
19
+ quantidade: quantidade,
20
+ valorUnitario: valor_unitario,
21
+ infoAdicional: info_adicional
22
+ }
23
+ end
24
+ end
25
+ end
@@ -29,7 +29,7 @@ module TinyErpApi
29
29
  sellers >> response_json["vendedores"]
30
30
  end
31
31
  end
32
- build_hash_sellers(sellers)
32
+ build_hash_sellers(sellers)
33
33
  end
34
34
 
35
35
  def self.find_by_name(name)
@@ -0,0 +1,29 @@
1
+ module TinyErpApi
2
+ class Shipment
3
+
4
+ attr_reader :id_transportador, :frete_por_conta, :id_forma_envio, :id_forma_frete, :codigo_rastreamento, :url_rastreamento
5
+ def initialize(id_transportador: nil, frete_por_conta: nil, id_forma_envio: nil, id_forma_frete: nil, codigo_rastreamento: nil, url_rastreamento: nil)
6
+ @id_transportador = id_transportador
7
+ @frete_por_conta = frete_por_conta
8
+ @id_forma_envio = id_forma_envio
9
+ @id_forma_frete = id_forma_frete
10
+ @codigo_rastreamento = codigo_rastreamento
11
+ @url_rastreamento = url_rastreamento
12
+ end
13
+
14
+ def to_api_hash
15
+ {
16
+ id: id_transportador,
17
+ fretePorConta: frete_por_conta,
18
+ formaEnvio: {
19
+ id: id_forma_envio
20
+ },
21
+ formaFrete: {
22
+ id: id_forma_frete
23
+ },
24
+ codigoRastreamento: codigo_rastreamento,
25
+ urlRastreamento: url_rastreamento
26
+ }
27
+ end
28
+ end
29
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module TinyErpApi
4
- VERSION = "1.0.0"
4
+ VERSION = "2.0.0"
5
5
  end
data/lib/tiny_erp_api.rb CHANGED
@@ -3,10 +3,15 @@
3
3
  require "ac"
4
4
  require_relative "tiny_erp_api/version"
5
5
  require_relative "tiny_erp_api/client"
6
- require_relative "tiny_erp_api/customer"
7
- require_relative "tiny_erp_api/order"
8
- require_relative "tiny_erp_api/product"
9
- require_relative "tiny_erp_api/seller"
6
+ # require_relative "tiny_erp_api/customer" # Deixamos de usar
7
+ # require_relative "tiny_erp_api/order" # Deixamos de usar
8
+ # require_relative "tiny_erp_api/product" # Deixamos de usar
9
+ # require_relative "tiny_erp_api/seller" # Deixamos de usar
10
+ require_relative "tiny_erp_api/item"
11
+ require_relative "tiny_erp_api/address"
12
+ require_relative "tiny_erp_api/shipment"
13
+ require_relative "tiny_erp_api/installment"
14
+ require_relative "tiny_erp_api/integrated_payment"
10
15
 
11
16
  module TinyErpApi
12
17
  class Error < StandardError; end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tiny_erp_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
- - Hamilton Tumenas Borges
7
+ - Todas Essas Coisas
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-05-08 00:00:00.000000000 Z
11
+ date: 2026-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ac
@@ -39,19 +39,24 @@ files:
39
39
  - generators/tiny_erp_api/install/install_generator.rb
40
40
  - generators/tiny_erp_api/install/templates/initalizer.rb
41
41
  - lib/tiny_erp_api.rb
42
+ - lib/tiny_erp_api/address.rb
42
43
  - lib/tiny_erp_api/client.rb
43
44
  - lib/tiny_erp_api/customer.rb
45
+ - lib/tiny_erp_api/installment.rb
46
+ - lib/tiny_erp_api/integrated_payment.rb
47
+ - lib/tiny_erp_api/item.rb
44
48
  - lib/tiny_erp_api/order.rb
45
49
  - lib/tiny_erp_api/product.rb
46
50
  - lib/tiny_erp_api/seller.rb
51
+ - lib/tiny_erp_api/shipment.rb
47
52
  - lib/tiny_erp_api/version.rb
48
53
  - sig/tiny_erp_api.rbs
49
- homepage: https://github.com/hamiltontborges
54
+ homepage: https://github.com/todasessascoisas/tiny_erp_api
50
55
  licenses:
51
56
  - MIT
52
57
  metadata:
53
- homepage_uri: https://github.com/hamiltontborges
54
- source_code_uri: https://github.com/hamiltontborges/tiny_erp_api
58
+ homepage_uri: https://github.com/todasessascoisas/tiny_erp_api
59
+ source_code_uri: https://github.com/todasessascoisas/tiny_erp_api
55
60
  post_install_message:
56
61
  rdoc_options: []
57
62
  require_paths:
@@ -67,7 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
67
72
  - !ruby/object:Gem::Version
68
73
  version: '0'
69
74
  requirements: []
70
- rubygems_version: 3.5.10
75
+ rubygems_version: 3.5.3
71
76
  signing_key:
72
77
  specification_version: 4
73
78
  summary: Gem to interact with Tiny ERP API.