retailcrm-api 0.0.2 → 0.0.6
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/README.markdown +133 -5
- data/lib/retailcrm-api/api_request.rb +18 -5
- data/lib/retailcrm-api/request.rb +6 -8
- data/lib/retailcrm-api/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19aca33fa8aabb3a4cd9acffaa7ed004cbd8be0a126ddb8f4c93b162fb60c50a
|
4
|
+
data.tar.gz: ea0d5c405d9c6073044a028eea147c207a0bc7ccbb784b02ddd6d6b108e40661
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a10e4ac6b8700f48597a3585a9a0cf5ef2aa646fedddec463fa02c7573f4c1b877335e2bbf6d8e99a76ae10675b4a0c00f858f050d924689774f732f9e45d3f8
|
7
|
+
data.tar.gz: 953ae085065c09ab797cef8bdd66cc4465500e43617d8ff1816305ec54755e63f2b47a55a2629eab5fca597d4ad3c200f07bbb2113d9b1418b8514b6ed296568
|
data/README.markdown
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
API wrapper для RetailCRM
|
4
4
|
|
5
|
-
# Установка
|
5
|
+
# Установка
|
6
6
|
|
7
7
|
## Ruby
|
8
8
|
$ gem install retailcrm-api
|
@@ -70,20 +70,105 @@ RetailcrmApi::Request.logger = MyLogger.new
|
|
70
70
|
|
71
71
|
### [Получение списка расходов, удовлетворяющих заданному фильтру](https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#get--api-v5-costs)
|
72
72
|
```ruby
|
73
|
-
|
73
|
+
params = {
|
74
|
+
filter: {
|
75
|
+
minSumm: 0
|
76
|
+
}
|
77
|
+
}
|
78
|
+
RetailcrmApi::Request.costs.retrieve(params: params).body
|
74
79
|
# => {:success=>true, :pagination=>{:limit=>20, :totalCount=>296, :currentPage=>1, :totalPageCount=>15}, :costs=>[{:id=>296, :dateFrom=>"2021-07-29", :dateTo=>"2021-07-29", :summ=>13996, :costItem=>"products-purchase-price", :createdAt=>"2021-07-29 00:34:35", :order=>{:id=>36, :number=>"36C"}, :sites=>["b12-skillum-ru"]}]}
|
75
80
|
```
|
81
|
+
### [Создание расхода](https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-costs-create)
|
82
|
+
```ruby
|
83
|
+
body = {
|
84
|
+
site: "deppa-ru",
|
85
|
+
cost: {
|
86
|
+
summ: 100,
|
87
|
+
costItem: "office-expenses",
|
88
|
+
dateFrom: (DateTime.now - 1.day).strftime("%Y-%m-%d"),
|
89
|
+
dateTo: DateTime.now.strftime("%Y-%m-%d")
|
90
|
+
}
|
91
|
+
}
|
92
|
+
RetailcrmApi::Request.costs.create(body: body).body
|
93
|
+
# => {:success=>true, :id=>297}
|
94
|
+
```
|
95
|
+
### [Пакетное удаление расходов](https://docs.retailcrm.ru/Developers/APIhttps://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-costs-delete)
|
96
|
+
```ruby
|
97
|
+
body = {
|
98
|
+
ids: [297]
|
99
|
+
}
|
100
|
+
RetailcrmApi::Request.costs.create(body: body, suffix: "delete").body
|
101
|
+
# => {:success=>true, :count=>1, :notRemovedIds=>[]}
|
102
|
+
```
|
103
|
+
### [Пакетная загрузка расходов](https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-costs-upload)
|
104
|
+
```ruby
|
105
|
+
body = {
|
106
|
+
costs: [
|
107
|
+
{
|
108
|
+
sites: ["deppa-ru"],
|
109
|
+
summ: 100,
|
110
|
+
costItem: "office-expenses",
|
111
|
+
dateFrom: (DateTime.now - 1.day).strftime("%Y-%m-%d"),
|
112
|
+
dateTo: DateTime.now.strftime("%Y-%m-%d")
|
113
|
+
}
|
114
|
+
]
|
115
|
+
}
|
116
|
+
RetailcrmApi::Request.costs.create(body: body, suffix: "upload").body
|
117
|
+
# => {:success=>true, :uploadedCosts=>[298]}
|
118
|
+
```
|
119
|
+
### [Получение информации о расходе](https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#get--api-v5-costs-id)
|
120
|
+
```ruby
|
121
|
+
RetailcrmApi::Request.costs(298).retrieve.body
|
122
|
+
# => {:success=>true, :cost=>{:id=>298, :dateFrom=>"2021-08-02", :dateTo=>"2021-08-03", :summ=>100, :costItem=>"office-expenses", :createdAt=>"2021-08-03 22:12:34", :sites=>["deppa-ru"]}}
|
123
|
+
```
|
124
|
+
### [Редактирование расхода](https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-costs-id-edit)
|
125
|
+
```ruby
|
126
|
+
body = {
|
127
|
+
site: "deppa-ru",
|
128
|
+
cost: {
|
129
|
+
summ: 200,
|
130
|
+
costItem: "office-expenses",
|
131
|
+
dateFrom: (DateTime.now - 1.day).strftime("%Y-%m-%d"),
|
132
|
+
dateTo: DateTime.now.strftime("%Y-%m-%d")
|
133
|
+
}
|
134
|
+
}
|
135
|
+
RetailcrmApi::Request.costs(298).update(body: body).body
|
136
|
+
# => {:success=>true, :id=>298}
|
137
|
+
```
|
138
|
+
### [Удаление расхода](https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-costs-id-delete)
|
139
|
+
```ruby
|
140
|
+
RetailcrmApi::Request.costs(298).delete.body
|
141
|
+
# => {:success=>true}
|
142
|
+
```
|
143
|
+
|
144
|
+
## Пользовательские поля
|
145
|
+
### [Получение списка пользовательских полей, удовлетворяющих заданному фильтру](https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#get--api-v5-custom-fields)
|
146
|
+
```ruby
|
147
|
+
params = {
|
148
|
+
filter: {
|
149
|
+
type: "date"
|
150
|
+
}
|
151
|
+
}
|
152
|
+
RetailcrmApi::Request.custom_fields.retrieve(params: params).body
|
153
|
+
# =>{:success=>true, :pagination=>{:limit=>20, :totalCount=>0, :currentPage=>1, :totalPageCount=>0}, :customFields=>[]}
|
154
|
+
```
|
76
155
|
|
77
156
|
## Клиенты
|
78
157
|
### [Получение списка клиентов, удовлетворяющих заданному фильтру](https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#get--api-v5-customers)
|
79
158
|
```ruby
|
80
|
-
|
81
|
-
|
159
|
+
params = {
|
160
|
+
limit: 100,
|
161
|
+
filter: {
|
162
|
+
sex: "male"
|
163
|
+
}
|
164
|
+
}
|
165
|
+
RetailcrmApi::Request.customers.retrieve(params: params).body
|
166
|
+
#=> {:success=>true, :pagination=>{:limit=>100, :totalCount=>0, :currentPage=>1, :totalPageCount=>0}, :customers=>[]}
|
82
167
|
```
|
83
168
|
### [Создание клиента](https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-customers-create)
|
84
169
|
```ruby
|
85
170
|
body = {
|
86
|
-
site: 'deppa',
|
171
|
+
site: 'deppa-ru',
|
87
172
|
customer: {
|
88
173
|
externalId: 1,
|
89
174
|
firstName: 'Павел',
|
@@ -92,4 +177,47 @@ body = {
|
|
92
177
|
}
|
93
178
|
RetailcrmApi::Request.customers.create(body: body).body
|
94
179
|
#=> {:success=>true, :id=>54}
|
180
|
+
```
|
181
|
+
### [Пакетная загрузка клиентов](https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-customers-upload)
|
182
|
+
```ruby
|
183
|
+
body = {
|
184
|
+
site: 'deppa-ru',
|
185
|
+
customers: [
|
186
|
+
{
|
187
|
+
externalId: 3,
|
188
|
+
firstName: 'Имя',
|
189
|
+
lastName: 'Фамилия'
|
190
|
+
},
|
191
|
+
{
|
192
|
+
externalId: 4,
|
193
|
+
firstName: 'Имя2',
|
194
|
+
lastName: 'Фамилия2'
|
195
|
+
}
|
196
|
+
]
|
197
|
+
}
|
198
|
+
RetailcrmApi::Request.customers.create(body: body, suffix: "upload").body
|
199
|
+
```
|
200
|
+
|
201
|
+
## Корпоративные клиенты
|
202
|
+
### [Получение списка корпоративных клиентов, удовлетворяющих заданному фильтру](https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#get--api-v5-customers-corporate)
|
203
|
+
```ruby
|
204
|
+
RetailcrmApi::Request.customers_corporate.retrieve.body
|
205
|
+
# => {:success=>true, :pagination=>{:limit=>20, :totalCount=>0, :currentPage=>1, :totalPageCount=>0}, :customersCorporate=>[]}
|
206
|
+
```
|
207
|
+
|
208
|
+
### [Пакетная загрузка корпоративных клиентов](https://docs.retailcrm.ru/Developers/API/APIVersions/APIv5#post--api-v5-customers-corporate-upload)
|
209
|
+
```ruby
|
210
|
+
body = {
|
211
|
+
site: 'deppa-ru"',
|
212
|
+
customersCorporate: [
|
213
|
+
{
|
214
|
+
externalId: 3,
|
215
|
+
nickName: 'test1'
|
216
|
+
},
|
217
|
+
{
|
218
|
+
externalId: 4,
|
219
|
+
nickName: 'test2'
|
220
|
+
}
|
221
|
+
]
|
222
|
+
}
|
95
223
|
```
|
@@ -9,11 +9,16 @@ module RetailcrmApi
|
|
9
9
|
validate_api_key
|
10
10
|
begin
|
11
11
|
response = self.rest_client(suffix).post do |request|
|
12
|
-
configure_request(request: request, params: params, headers: headers, body:
|
12
|
+
configure_request(request: request, params: params, headers: headers, body: body)
|
13
13
|
end
|
14
14
|
parse_response(response)
|
15
15
|
rescue => e
|
16
|
-
|
16
|
+
if e.response.dig(:status) == 403 && first_time
|
17
|
+
sleep(0.3.second)
|
18
|
+
self.post(params: params, headers: headers, suffix: suffix, body: body, first_time: false)
|
19
|
+
else
|
20
|
+
handle_error(e)
|
21
|
+
end
|
17
22
|
end
|
18
23
|
end
|
19
24
|
|
@@ -26,7 +31,12 @@ module RetailcrmApi
|
|
26
31
|
end
|
27
32
|
parse_response(response)
|
28
33
|
rescue => e
|
29
|
-
|
34
|
+
if e.response.dig(:status) == 403 && first_time
|
35
|
+
sleep(0.3.second)
|
36
|
+
self.get(params: params, headers: headers, first_time: false)
|
37
|
+
else
|
38
|
+
handle_error(e)
|
39
|
+
end
|
30
40
|
end
|
31
41
|
end
|
32
42
|
|
@@ -96,11 +106,14 @@ module RetailcrmApi
|
|
96
106
|
def configure_request(request: nil, params: nil, headers: nil, body: nil)
|
97
107
|
if request
|
98
108
|
request.params.merge!(params) if params
|
99
|
-
request.headers['Content-Type'] = 'application/
|
109
|
+
request.headers['Content-Type'] = 'application/x-www-form-urlencoded'
|
100
110
|
request.headers['X-API-KEY'] = "#{self.api_key}"
|
101
111
|
request.headers['User-Agent'] = "RetailCrmApi/#{RetailcrmApi::VERSION} Ruby gem"
|
102
112
|
request.headers.merge!(headers) if headers
|
103
|
-
|
113
|
+
if body
|
114
|
+
body.each { |k, v| body[k] = MultiJson.dump(v) }
|
115
|
+
request.body = URI.encode_www_form(body)
|
116
|
+
end
|
104
117
|
request.options.timeout = self.timeout
|
105
118
|
request.options.open_timeout = self.open_timeout
|
106
119
|
end
|
@@ -6,8 +6,6 @@ module RetailcrmApi
|
|
6
6
|
DEFAULT_OPEN_TIMEOUT = 60
|
7
7
|
|
8
8
|
def initialize(api_key: nil, api_endpoint: nil, timeout: nil, open_timeout: nil, proxy: nil, faraday_adapter: nil, symbolize_keys: false, debug: false, logger: nil, test: false)
|
9
|
-
p "Request initialize #{api_key}"
|
10
|
-
|
11
9
|
@path_parts = []
|
12
10
|
@api_key = api_key || self.class.api_key || ENV['RETAILCRM_API_KEY']
|
13
11
|
@api_key = @api_key.strip if @api_key
|
@@ -25,7 +23,7 @@ module RetailcrmApi
|
|
25
23
|
end
|
26
24
|
|
27
25
|
def method_missing(method, *args)
|
28
|
-
@path_parts << method.to_s.downcase
|
26
|
+
@path_parts << method.to_s.gsub("_", "-").downcase
|
29
27
|
@path_parts << args if args.length > 0
|
30
28
|
@path_parts.flatten!
|
31
29
|
self
|
@@ -47,14 +45,14 @@ module RetailcrmApi
|
|
47
45
|
@path_parts.join('/')
|
48
46
|
end
|
49
47
|
|
50
|
-
def create(params: nil, headers: nil, body: {})
|
51
|
-
APIRequest.new(builder: self).post(params: params, headers: headers, suffix:
|
48
|
+
def create(params: nil, headers: nil, body: {}, suffix: 'create')
|
49
|
+
APIRequest.new(builder: self).post(params: params, headers: headers, suffix: suffix, body: body)
|
52
50
|
ensure
|
53
51
|
reset
|
54
52
|
end
|
55
53
|
|
56
54
|
def update(params: nil, headers: nil, body: {})
|
57
|
-
APIRequest.new(builder: self).post(params: params, headers: headers, suffix: '
|
55
|
+
APIRequest.new(builder: self).post(params: params, headers: headers, suffix: 'edit', body: body)
|
58
56
|
ensure
|
59
57
|
reset
|
60
58
|
end
|
@@ -65,8 +63,8 @@ module RetailcrmApi
|
|
65
63
|
reset
|
66
64
|
end
|
67
65
|
|
68
|
-
def delete(params: nil, headers: nil
|
69
|
-
APIRequest.new(builder: self).post(params: params, headers: headers)
|
66
|
+
def delete(params: nil, headers: nil)
|
67
|
+
APIRequest.new(builder: self).post(params: params, headers: headers, suffix: 'delete')
|
70
68
|
ensure
|
71
69
|
reset
|
72
70
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: retailcrm-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pavel Osetrov
|
@@ -76,7 +76,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
76
76
|
- !ruby/object:Gem::Version
|
77
77
|
version: '0'
|
78
78
|
requirements: []
|
79
|
-
rubygems_version: 3.
|
79
|
+
rubygems_version: 3.1.4
|
80
80
|
signing_key:
|
81
81
|
specification_version: 4
|
82
82
|
summary: RetailCRM API
|