amocrm-rails 0.0.5 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.markdown +395 -32
- data/lib/amocrm-rails.rb +19 -5
- data/lib/amocrm-rails/api_request.rb +10 -10
- data/lib/concern.rb +30 -0
- data/lib/generators/amocrm_rails/install/install_generator.rb +23 -2
- data/lib/generators/amocrm_rails/install/templates/amocrm.rb +3 -3
- data/lib/generators/amocrm_rails/install/templates/amocrm.yml +2 -5
- data/lib/generators/amocrm_rails/install/templates/devise/app/controllers/amocrm_controller.rb +37 -0
- data/lib/generators/amocrm_rails/install/templates/devise/app/views/amocrm/code.html.erb +11 -0
- data/lib/generators/amocrm_rails/install/templates/devise/app/views/amocrm/link.html.erb +6 -0
- data/lib/generators/amocrm_rails/install/templates/devise/config/amocrm.rb +16 -0
- data/lib/generators/amocrm_rails/install/templates/devise/config/initializers/amocrm.rb +8 -0
- data/lib/helper.rb +5 -0
- metadata +8 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c14d2a512bd63c3665686ba2f4aa8f89c9e6d8d288e81097a1639dd5282ab47
|
4
|
+
data.tar.gz: 428ec5a4019a2cde34024edb6713605814707d95366c9056414773e33809b373
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a257068a57a521c2c911d7880cc8a6fcf4af2a8de311f66ff102dfcdca2b8e387449b8afd677c65641736b657b8ca76b7f6c4627e6e72d5c3d72ba02796a6a1
|
7
|
+
data.tar.gz: 03c0f984571da75fe687d734be0ca5569a49e703cc3e418c7113140ae72294f9678a5b6baf081cf4963f1b662d1d0ac3b51cb5e10d8ea6c9108c96133562aa6f
|
data/README.markdown
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
## Оглавление
|
4
4
|
0. [Установка](#install)
|
5
|
+
1. [Упрощенная авторизация](#easy_auth)
|
6
|
+
2. [Авторизация через перенаправления пользователя (требуется gem Devise)](#devise_auth)
|
5
7
|
1. [Параметры аккаунта](#account)
|
6
8
|
2. [Сделки](#leads)
|
7
9
|
1. [Список сделок](#leads_retrieve)
|
@@ -166,9 +168,57 @@
|
|
166
168
|
|
167
169
|
и запустите `bundle install`.
|
168
170
|
|
169
|
-
|
171
|
+
Для упрощенной авторизации:
|
170
172
|
|
171
|
-
|
173
|
+
`rails g amocrm_rails:install`
|
174
|
+
|
175
|
+
Для авторизации через перенаправление пользователя (требуется [gem devise](https://github.com/heartcombo/devise)):
|
176
|
+
|
177
|
+
`rails g amocrm_rails:install --with=devise`
|
178
|
+
|
179
|
+
### Получение CLIENT_ID, CLIENT_SECRET и CODE
|
180
|
+
|
181
|
+
#### <a name="easy_auth"></a> Упрощенная авторизация
|
182
|
+
|
183
|
+
1. Переходим на страницу интеграций https://yourdomain.amocrm.ru/settings/widgets/ и нажимаем "+ СОЗДАТЬ ИНТЕГРАЦИЮ"
|
184
|
+
![alt Страница виджетов](https://storage.deppa.ru/uploads/widgets.png)
|
185
|
+
2. Заполняем поля, в первое поле вводим https://yourdomain.com/amocrm и нажимаем "Сохранить"
|
186
|
+
![alt Создание интеграции](https://storage.deppa.ru/uploads/widget_add.png)
|
187
|
+
3. Переходим на таб "Ключи и доступы". Код авторизации работает 20 минут.
|
188
|
+
![alt Создание интеграции](https://storage.deppa.ru/uploads/widget_keys.png)
|
189
|
+
|
190
|
+
В файл `config/amocrm.yml` вставляем данные.
|
191
|
+
|
192
|
+
#### <a name="devise_auth"></a> Авторизация через перенаправления пользователя (требуется [gem Devise](https://github.com/heartcombo/devise))
|
193
|
+
|
194
|
+
Выполняем все шаги как при [упрощенной авторизации](#easy_auth)
|
195
|
+
|
196
|
+
Ссылка на получение кода:
|
197
|
+
```rhtml
|
198
|
+
<%= link_to "Установить интеграцию",
|
199
|
+
amocrm_oauth_url(state: current_user.try(:id)),
|
200
|
+
class: 'btn btn-primary' %>
|
201
|
+
```
|
202
|
+
Пример доступен по адресу:
|
203
|
+
`
|
204
|
+
https://yourdomain/amocrm/link
|
205
|
+
`
|
206
|
+
|
207
|
+
![alt Страница с кнопкой](https://storage.deppa.ru/uploads/amo_link.png)
|
208
|
+
|
209
|
+
Нажимаем на кнопку, логинимся в амо и даём права приложению
|
210
|
+
|
211
|
+
![alt Авторизация в amo](https://storage.deppa.ru/uploads/amo_form.png)
|
212
|
+
|
213
|
+
После вы будуте перенаправлены на страницу https://yourdomain.com/amocrm
|
214
|
+
|
215
|
+
![alt Страница с кнопкой](https://storage.deppa.ru/uploads/amo_code_and_account.png)
|
216
|
+
|
217
|
+
Если вы увидили код и информацию об аккаунте - всё в порядке, копировать код нет необходимости, страницу можно закрыть.
|
218
|
+
|
219
|
+
Если вы не используете [gem Devise](https://github.com/heartcombo/devise), то вам необходимо реализовать в
|
220
|
+
application_controller.rb методы `current_user` для получения текущего пользователя, `user_signed_in?` для проверки
|
221
|
+
авторизован ли посетитель на вашем сайте и `new_user_session_path` для получения пути к странице авторизции.
|
172
222
|
|
173
223
|
Вы можете изменять `timeout`, `open_timeout`, `faraday_adapter`, `proxy`, `symbolize_keys`, `logger`, и `debug`:
|
174
224
|
|
@@ -298,7 +348,7 @@ p(response.body)
|
|
298
348
|
```ruby
|
299
349
|
body = [
|
300
350
|
{
|
301
|
-
source_name: "
|
351
|
+
source_name: "ООО Деппа",
|
302
352
|
source_uid: "a1fee7c0fc436088e64ba2e8822ba2b3",
|
303
353
|
created_at: 1510261200,
|
304
354
|
_embedded: {
|
@@ -315,7 +365,7 @@ body = [
|
|
315
365
|
],
|
316
366
|
companies: [
|
317
367
|
{
|
318
|
-
name: "
|
368
|
+
name: "ООО Деппа"
|
319
369
|
}
|
320
370
|
]
|
321
371
|
},
|
@@ -324,7 +374,7 @@ body = [
|
|
324
374
|
uniq: "a1fe231cc88e64ba2e8822ba2b3ewrw",
|
325
375
|
duration: 54,
|
326
376
|
service_code: "CkAvbEwPam6sad",
|
327
|
-
link: "https://
|
377
|
+
link: "https://deppa.ru",
|
328
378
|
phone: 79998888888,
|
329
379
|
called_at: 1510261200,
|
330
380
|
from: "onlinePBX"
|
@@ -339,7 +389,7 @@ p(response.body)
|
|
339
389
|
```ruby
|
340
390
|
body = [
|
341
391
|
{
|
342
|
-
source_name: "
|
392
|
+
source_name: "ООО Деппа",
|
343
393
|
source_uid: "a1fee7c0fc436088e64ba2e8822ba2b3",
|
344
394
|
created_at: 1590830520,
|
345
395
|
_embedded: {
|
@@ -376,7 +426,7 @@ body = [
|
|
376
426
|
],
|
377
427
|
companies: [
|
378
428
|
{
|
379
|
-
name: "
|
429
|
+
name: "ООО Деппа"
|
380
430
|
}
|
381
431
|
]
|
382
432
|
},
|
@@ -385,7 +435,7 @@ body = [
|
|
385
435
|
form_id: "a1fee7c0fc436088e64ba2e8822ba2b3ewrw",
|
386
436
|
form_sent_at: 1590830520,
|
387
437
|
form_name: "Форма заявки для полёта в космос",
|
388
|
-
form_page: "https://
|
438
|
+
form_page: "https://deppa.ru",
|
389
439
|
referer: "https://www.google.com/search?&q=elon+musk"
|
390
440
|
}
|
391
441
|
}
|
@@ -561,7 +611,7 @@ contacts = response.body[:_embedded][:contacts]
|
|
561
611
|
```ruby
|
562
612
|
params = {
|
563
613
|
filter: {
|
564
|
-
name: "
|
614
|
+
name: "ООО Деппа"
|
565
615
|
}
|
566
616
|
}
|
567
617
|
response = AmocrmRails::Request.companies.retrieve(params: params)
|
@@ -1376,21 +1426,21 @@ tag_id = tags.first[:id]
|
|
1376
1426
|
### <a name="add_tags_to_entity"></a> [Добавление тегов к сущности](https://www.amocrm.ru/developers/content/crm_platform/tags-api#add-tags-to-entity)
|
1377
1427
|
```ruby
|
1378
1428
|
body_item = {
|
1379
|
-
|
1380
|
-
|
1429
|
+
_embedded: {
|
1430
|
+
tags: [
|
1381
1431
|
{
|
1382
|
-
|
1432
|
+
id: tag_id
|
1383
1433
|
}
|
1384
1434
|
]
|
1385
1435
|
}
|
1386
1436
|
}
|
1387
1437
|
body = [
|
1388
1438
|
{
|
1389
|
-
|
1390
|
-
|
1391
|
-
|
1439
|
+
id: object_id,
|
1440
|
+
_embedded: {
|
1441
|
+
tags: [
|
1392
1442
|
{
|
1393
|
-
|
1443
|
+
id: tag_id
|
1394
1444
|
}
|
1395
1445
|
]
|
1396
1446
|
}
|
@@ -1417,15 +1467,15 @@ AmocrmRails::Request.contacts(customer_id).update(body: body_item)
|
|
1417
1467
|
|
1418
1468
|
```ruby
|
1419
1469
|
body_item = {
|
1420
|
-
|
1421
|
-
|
1470
|
+
_embedded: {
|
1471
|
+
tags: nil
|
1422
1472
|
}
|
1423
1473
|
}
|
1424
1474
|
body = [
|
1425
1475
|
{
|
1426
|
-
|
1427
|
-
|
1428
|
-
|
1476
|
+
id: object_id,
|
1477
|
+
_embedded: {
|
1478
|
+
tags: nil
|
1429
1479
|
}
|
1430
1480
|
}
|
1431
1481
|
]
|
@@ -1591,7 +1641,7 @@ body = [
|
|
1591
1641
|
uniq: "8f52d38a-5fb3-406d-93a3-a4832dc28f8b",
|
1592
1642
|
duration: 60,
|
1593
1643
|
source: "onlinePBX",
|
1594
|
-
link: "https://
|
1644
|
+
link: "https://deppa.ru",
|
1595
1645
|
phone: "+79999999999"
|
1596
1646
|
}
|
1597
1647
|
},
|
@@ -1602,7 +1652,7 @@ body = [
|
|
1602
1652
|
uniq: "8f52d38a-5fb3-406d-93a3-a4832dc28f8b",
|
1603
1653
|
duration: 60,
|
1604
1654
|
source: "onlinePBX",
|
1605
|
-
link: "https://
|
1655
|
+
link: "https://deppa.ru",
|
1606
1656
|
phone: "+79999999999"
|
1607
1657
|
}
|
1608
1658
|
},
|
@@ -1624,7 +1674,7 @@ body_item = {
|
|
1624
1674
|
uniq: "8f52d38a-5fb3-406d-93a3-a4832dc28f8b",
|
1625
1675
|
duration: 60,
|
1626
1676
|
source: "onlinePBX",
|
1627
|
-
link: "https://
|
1677
|
+
link: "https://deppa.ru",
|
1628
1678
|
phone: "+79999999999"
|
1629
1679
|
}
|
1630
1680
|
}
|
@@ -1662,7 +1712,7 @@ body = [
|
|
1662
1712
|
uniq: "8f52d38a-5fb3-406d-93a3-a4832dc28f8b",
|
1663
1713
|
duration: 60,
|
1664
1714
|
source: "onlinePBX",
|
1665
|
-
link: "https://
|
1715
|
+
link: "https://deppa.ru",
|
1666
1716
|
phone: "+79999999999"
|
1667
1717
|
}
|
1668
1718
|
},
|
@@ -1673,7 +1723,7 @@ body = [
|
|
1673
1723
|
uniq: "8f52d38a-5fb3-406d-93a3-a4832dc28f8b",
|
1674
1724
|
duration: 60,
|
1675
1725
|
source: "onlinePBX",
|
1676
|
-
link: "https://
|
1726
|
+
link: "https://deppa.ru",
|
1677
1727
|
phone: "+79999999999"
|
1678
1728
|
}
|
1679
1729
|
},
|
@@ -1695,7 +1745,7 @@ body_item = {
|
|
1695
1745
|
uniq: "8f52d38a-5fb3-406d-93a3-a4832dc28f8b",
|
1696
1746
|
duration: 60,
|
1697
1747
|
source: "onlinePBX",
|
1698
|
-
link: "https://
|
1748
|
+
link: "https://deppa.ru",
|
1699
1749
|
phone: "+79999999999"
|
1700
1750
|
}
|
1701
1751
|
}
|
@@ -1858,7 +1908,6 @@ response = AmocrmRails::Request.customers.transactions(transaction_id).delete
|
|
1858
1908
|
p(response.body)
|
1859
1909
|
```
|
1860
1910
|
### <a name="customer_bonus_points_update"></a> [Списание/начисление бонусных баллов покупателю](https://www.amocrm.ru/developers/content/crm_platform/customers-api#customer–bonus-points-update)
|
1861
|
-
|
1862
1911
|
```ruby
|
1863
1912
|
body = {
|
1864
1913
|
earn: 500
|
@@ -1876,48 +1925,362 @@ status_id = statuses.first[:id]
|
|
1876
1925
|
### <a name="customers_statuses_detail"></a> [Получение статуса покупателей по ID](https://www.amocrm.ru/developers/content/crm_platform/customers-statuses-api#customer-status-detail)
|
1877
1926
|
```ruby
|
1878
1927
|
response = AmocrmRails::Request.customers.statuses(status_id).retrieve
|
1928
|
+
status = response.body
|
1929
|
+
```
|
1930
|
+
### <a name="customers_statuses_add"></a> [Добавление статусов в воронку](https://www.amocrm.ru/developers/content/crm_platform/customers-statuses-api#customers-statuses-add)
|
1931
|
+
```ruby
|
1932
|
+
body = [
|
1933
|
+
{
|
1934
|
+
name: "Новый статус",
|
1935
|
+
sort: 100,
|
1936
|
+
color: "#fffeb2"
|
1937
|
+
},
|
1938
|
+
{
|
1939
|
+
name: "Новый статус 2",
|
1940
|
+
sort: 200,
|
1941
|
+
color: "#fffeb2"
|
1942
|
+
}
|
1943
|
+
]
|
1944
|
+
response = AmocrmRails::Request.customers.statuses.create(body: body)
|
1945
|
+
p(response.body)
|
1879
1946
|
statuses = response.body[:_embedded][:statuses]
|
1880
1947
|
status_id = statuses.first[:id]
|
1881
1948
|
```
|
1882
|
-
### <a name="customers_statuses_add"></a> [Добавление статусов в воронку](https://www.amocrm.ru/developers/content/crm_platform/customers-statuses-api#customers-statuses-add)
|
1883
1949
|
### <a name="customers_statuses_edit"></a> [Редактирование статуса покупателей](https://www.amocrm.ru/developers/content/crm_platform/customers-statuses-api#customers-status-edit)
|
1950
|
+
```ruby
|
1951
|
+
body = {
|
1952
|
+
name: "Новое название для статуса",
|
1953
|
+
color: "#c1e0ff"
|
1954
|
+
}
|
1955
|
+
response = AmocrmRails::Request.customers.statuses(status_id).update(body: body)
|
1956
|
+
customer = response.body
|
1957
|
+
```
|
1884
1958
|
### <a name="customer_status_delete"></a> [Удаление статуса покупателей](https://www.amocrm.ru/developers/content/crm_platform/customers-statuses-api#customer-status-delete)
|
1959
|
+
```ruby
|
1960
|
+
AmocrmRails::Request.customers.statuses(status_id).delete
|
1961
|
+
```
|
1885
1962
|
### <a name="segments_list"></a> [Список сегментов покупателей](https://www.amocrm.ru/developers/content/crm_platform/customers-statuses-api#segments-list)
|
1963
|
+
```ruby
|
1964
|
+
response = AmocrmRails::Request.customers.segments
|
1965
|
+
segments = response.body[:_embedded][:segments]
|
1966
|
+
segment_id = segments.first[:id]
|
1967
|
+
```
|
1886
1968
|
### <a name="segments_detail"></a> [Получение сегмента покупателей по ID](https://www.amocrm.ru/developers/content/crm_platform/customers-statuses-api#segment-detail)
|
1969
|
+
```ruby
|
1970
|
+
response = AmocrmRails::Request.customers.segments(segment_id).retrieve
|
1971
|
+
segment = response.body
|
1972
|
+
```
|
1887
1973
|
### <a name="segments_add"></a> [Добавление сегмента покупателей](https://www.amocrm.ru/developers/content/crm_platform/customers-statuses-api#segment-add)
|
1974
|
+
```ruby
|
1975
|
+
body = {
|
1976
|
+
name: "Сегмент для примера",
|
1977
|
+
color: "ae003f"
|
1978
|
+
}
|
1979
|
+
response = AmocrmRails::Request.customers.segments.create(body: body)
|
1980
|
+
p(response.body)
|
1981
|
+
segment = response.body
|
1982
|
+
segment_id = segment[:id]
|
1983
|
+
```
|
1888
1984
|
### <a name="segments_edit"></a> [Редактирование сегмента покупателей](https://www.amocrm.ru/developers/content/crm_platform/customers-statuses-api#segment-edit)
|
1985
|
+
```ruby
|
1986
|
+
body = {
|
1987
|
+
name: "Новое имя для сегмента",
|
1988
|
+
color: "ae003f"
|
1989
|
+
}
|
1990
|
+
response = AmocrmRails::Request.customers.segments(segment_id).update(body: body)
|
1991
|
+
segment = response.body
|
1992
|
+
```
|
1889
1993
|
### <a name="segment_delete"></a> [Удаление сегмента покупателей](https://www.amocrm.ru/developers/content/crm_platform/customers-statuses-api#segment-delete)
|
1994
|
+
```ruby
|
1995
|
+
AmocrmRails::Request.customers.segments(segment_id).delete
|
1996
|
+
```
|
1890
1997
|
### <a name="customers_statuses_colors"></a> [Доступные цвета статусов](https://www.amocrm.ru/developers/content/crm_platform/customers-statuses-api#customers-statuses-colors)
|
1891
1998
|
### <a name="customers_statuses_colors"></a> [Доступные цвета сегментов](https://www.amocrm.ru/developers/content/crm_platform/customers-statuses-api#segments-colors)
|
1892
1999
|
|
1893
2000
|
## <a name="users"></a> [Пользователи](https://www.amocrm.ru/developers/content/crm_platform/users-api)
|
1894
2001
|
### <a name="users_list"></a> [Список пользователей](https://www.amocrm.ru/developers/content/crm_platform/users-api#users-list)
|
2002
|
+
```ruby
|
2003
|
+
params = {
|
2004
|
+
with: 'group',
|
2005
|
+
page: 0,
|
2006
|
+
limit: 10
|
2007
|
+
}
|
2008
|
+
response = AmocrmRails::Request.users.retrieve
|
2009
|
+
users = response.body[:_embedded][:users]
|
2010
|
+
user_id = users.first[:id]
|
2011
|
+
```
|
1895
2012
|
### <a name="users_detail"></a> [Получение пользователя по ID](https://www.amocrm.ru/developers/content/crm_platform/users-api#user-detail)
|
2013
|
+
```ruby
|
2014
|
+
params = {
|
2015
|
+
with: 'group'
|
2016
|
+
}
|
2017
|
+
response = AmocrmRails::Request.users(user_id).retrieve(params: params)
|
2018
|
+
user = response.body
|
2019
|
+
user_id = user[:id]
|
2020
|
+
```
|
1896
2021
|
### <a name="users_add"></a> [Добавление пользователей](https://www.amocrm.ru/developers/content/crm_platform/users-api#users-add)
|
2022
|
+
```ruby
|
2023
|
+
body = [
|
2024
|
+
{
|
2025
|
+
name: "Павел Осетров",
|
2026
|
+
email: 'pavel.osetrov@me.com'
|
2027
|
+
}
|
2028
|
+
]
|
2029
|
+
response = AmocrmRails::Request.users.create(body: body)
|
2030
|
+
p(response.body)
|
2031
|
+
users = response.body[:_embedded][:users]
|
2032
|
+
user_id = users.first[:id]
|
2033
|
+
```
|
1897
2034
|
### <a name="roles_list"></a> [Список ролей пользователей](https://www.amocrm.ru/developers/content/crm_platform/users-api#roles-list)
|
2035
|
+
```ruby
|
2036
|
+
params = {
|
2037
|
+
with: 'users',
|
2038
|
+
page: 0,
|
2039
|
+
limit: 10
|
2040
|
+
}
|
2041
|
+
response = AmocrmRails::Request.roles.retrieve
|
2042
|
+
roles = response.body[:_embedded][:roles]
|
2043
|
+
role_id = roles.first[:id]
|
2044
|
+
```
|
1898
2045
|
### <a name="roles_detail"></a> [Получение роли по ID](https://www.amocrm.ru/developers/content/crm_platform/users-api#role-detail)
|
2046
|
+
```ruby
|
2047
|
+
params = {
|
2048
|
+
with: 'users'
|
2049
|
+
}
|
2050
|
+
response = AmocrmRails::Request.roles(role_id).retrieve(params: params)
|
2051
|
+
role = response.body
|
2052
|
+
role_id = user[:id]
|
2053
|
+
```
|
1899
2054
|
### <a name="roles_add"></a> [Добавление ролей](https://www.amocrm.ru/developers/content/crm_platform/users-api#roles-add)
|
2055
|
+
```ruby
|
2056
|
+
body = [
|
2057
|
+
{
|
2058
|
+
name: "role 3",
|
2059
|
+
rights: {
|
2060
|
+
leads: {
|
2061
|
+
add: "A",
|
2062
|
+
edit: "G",
|
2063
|
+
view: "G",
|
2064
|
+
delete: "G",
|
2065
|
+
export: "G"
|
2066
|
+
},
|
2067
|
+
tasks: {
|
2068
|
+
edit: "A",
|
2069
|
+
delete: "A"
|
2070
|
+
},
|
2071
|
+
contacts: {
|
2072
|
+
add: "A",
|
2073
|
+
edit: "A",
|
2074
|
+
view: "A",
|
2075
|
+
delete: "A",
|
2076
|
+
export: "A"
|
2077
|
+
},
|
2078
|
+
companies: {
|
2079
|
+
add: "A",
|
2080
|
+
edit: "A",
|
2081
|
+
view: "A",
|
2082
|
+
delete: "A",
|
2083
|
+
export: "A"
|
2084
|
+
},
|
2085
|
+
mail_access: true,
|
2086
|
+
status_rights: [
|
2087
|
+
{
|
2088
|
+
entity_type: "leads",
|
2089
|
+
pipeline_id: 16056,
|
2090
|
+
status_id: 20542166,
|
2091
|
+
rights: {
|
2092
|
+
edit: "A",
|
2093
|
+
view: "A",
|
2094
|
+
delete: "A",
|
2095
|
+
export: "A"
|
2096
|
+
}
|
2097
|
+
}
|
2098
|
+
],
|
2099
|
+
catalog_access: true
|
2100
|
+
}
|
2101
|
+
}
|
2102
|
+
]
|
2103
|
+
response = AmocrmRails::Request.roles.create(body: body)
|
2104
|
+
p(response.body)
|
2105
|
+
roles = response.body[:_embedded][:roles]
|
2106
|
+
role_id = roles.first[:id]
|
2107
|
+
```
|
1900
2108
|
### <a name="roles_edit"></a> [Редактирование роли](https://www.amocrm.ru/developers/content/crm_platform/users-api#role-edit)
|
2109
|
+
```ruby
|
2110
|
+
body = {
|
2111
|
+
name: "role 3 modified",
|
2112
|
+
rights: {
|
2113
|
+
contacts: {
|
2114
|
+
add: "A",
|
2115
|
+
edit: "D",
|
2116
|
+
view: "D",
|
2117
|
+
delete: "D",
|
2118
|
+
export: "D"
|
2119
|
+
},
|
2120
|
+
status_rights: nil
|
2121
|
+
}
|
2122
|
+
}
|
2123
|
+
response = AmocrmRails::Request.roles(role_id).update(body: body)
|
2124
|
+
role = response.body
|
2125
|
+
```
|
2126
|
+
|
1901
2127
|
### <a name="roles_delete"></a> [Удаление роли](https://www.amocrm.ru/developers/content/crm_platform/users-api#role-delete)
|
2128
|
+
```ruby
|
2129
|
+
AmocrmRails::Request.roles(role_id).delete
|
2130
|
+
```
|
1902
2131
|
### <a name="users_common_rights"></a> [Общие обозначения прав пользователей](https://www.amocrm.ru/developers/content/crm_platform/users-api#common-rights)
|
1903
2132
|
### <a name="users_rights_dependence"></a> [Зависимости прав пользователей](https://www.amocrm.ru/developers/content/crm_platform/users-api#rights-dependence)
|
1904
2133
|
|
1905
2134
|
## <a name="products"></a> [Товары](https://www.amocrm.ru/developers/content/crm_platform/products-api)
|
1906
2135
|
## <a name="webhooks"></a> [Вебхуки](https://www.amocrm.ru/developers/content/crm_platform/webhooks-api)
|
1907
2136
|
### <a name="webhooks_list"></a> [Список установленных вебхуков в аккаунте](https://www.amocrm.ru/developers/content/crm_platform/webhooks-api#webhooks-list)
|
2137
|
+
```ruby
|
2138
|
+
response = AmocrmRails::Request.webhooks.retrieve
|
2139
|
+
webhooks = response.body[:_embedded][:webhooks]
|
2140
|
+
webhook_id = webhooks.first[:id]
|
2141
|
+
```
|
1908
2142
|
### <a name="webhooks_subscribe"></a> [Подписка на вебхук](https://www.amocrm.ru/developers/content/crm_platform/webhooks-api#webhook-subscribe)
|
2143
|
+
```ruby
|
2144
|
+
body = {
|
2145
|
+
destination: "https://deppa.ru",
|
2146
|
+
settings: [
|
2147
|
+
"add_lead"
|
2148
|
+
],
|
2149
|
+
sort: 10
|
2150
|
+
}
|
2151
|
+
response = AmocrmRails::Request.webhooks.create(body: body)
|
2152
|
+
p(response.body)
|
2153
|
+
webhook = response.body
|
2154
|
+
webhook_id = webhook[:id]
|
2155
|
+
```
|
1909
2156
|
### <a name="webhooks_delete"></a> [Отписка от событий](https://www.amocrm.ru/developers/content/crm_platform/webhooks-api#webhooks-delete)
|
2157
|
+
```ruby
|
2158
|
+
AmocrmRails::Request.webhooks(webhook_id).delete
|
2159
|
+
```
|
1910
2160
|
### <a name="webhooks_available_actions"></a> [Возможные событий](https://www.amocrm.ru/developers/content/crm_platform/webhooks-api#webhooks-available-actions)
|
1911
2161
|
|
1912
2162
|
## <a name="widgets"></a> [Виджеты](https://www.amocrm.ru/developers/content/crm_platform/widgets-api)
|
1913
2163
|
### <a name="widgets_list"></a> [Список виджетов](https://www.amocrm.ru/developers/content/crm_platform/widgets-api#widgets-list)
|
2164
|
+
```ruby
|
2165
|
+
params = {
|
2166
|
+
page: 0,
|
2167
|
+
limit: 10
|
2168
|
+
}
|
2169
|
+
response = AmocrmRails::Request.widgets.retrieve
|
2170
|
+
widgets = response.body[:_embedded][:widgets]
|
2171
|
+
widget_code = widgets.first[:code]
|
2172
|
+
```
|
1914
2173
|
### <a name="widgets_detail"></a> [Информация о виджете по его коду](https://www.amocrm.ru/developers/content/crm_platform/widgets-api#widget-detail)
|
2174
|
+
```ruby
|
2175
|
+
response = AmocrmRails::Request.widgets(widget_code).retrieve
|
2176
|
+
widget = response.body
|
2177
|
+
```
|
1915
2178
|
### <a name="widgets_install"></a> [Установка виджета в аккаунт](https://www.amocrm.ru/developers/content/crm_platform/widgets-api#widget-install)
|
2179
|
+
```ruby
|
2180
|
+
body = {
|
2181
|
+
login: "example",
|
2182
|
+
password: "eXaMp1E",
|
2183
|
+
script_path: "https://deppa.ru/"
|
2184
|
+
}
|
2185
|
+
response = AmocrmRails::Request.widgets.create(body: body)
|
2186
|
+
p(response.body)
|
2187
|
+
widget = response.body
|
2188
|
+
```
|
1916
2189
|
### <a name="widgets_uninstall"></a> [Удаление установки виджета](https://www.amocrm.ru/developers/content/crm_platform/widgets-api#widget-uninstall)
|
2190
|
+
```ruby
|
2191
|
+
AmocrmRails::Request.widgets(widget_code).delete
|
2192
|
+
```
|
1917
2193
|
### <a name="widgets_continue"></a> [Подтверждение выполнения блока виджета в Salesbot](https://www.amocrm.ru/developers/content/crm_platform/widgets-api#widget-continue)
|
1918
|
-
|
2194
|
+
```ruby
|
2195
|
+
body = {
|
2196
|
+
data: {
|
2197
|
+
status: "success"
|
2198
|
+
},
|
2199
|
+
execute_handlers: [
|
2200
|
+
{
|
2201
|
+
handler: "show",
|
2202
|
+
params: {
|
2203
|
+
type: "text",
|
2204
|
+
value: "Здесь текст"
|
2205
|
+
}
|
2206
|
+
},
|
2207
|
+
{
|
2208
|
+
handler: "show",
|
2209
|
+
params: {
|
2210
|
+
type: "buttons",
|
2211
|
+
value: "Нажми на кнопку",
|
2212
|
+
buttons: [
|
2213
|
+
"1ая кнопка",
|
2214
|
+
"2ая кнопка",
|
2215
|
+
"3ая кнопка",
|
2216
|
+
"4ая кнопка"
|
2217
|
+
]
|
2218
|
+
}
|
2219
|
+
},
|
2220
|
+
{
|
2221
|
+
handler: "show",
|
2222
|
+
params: {
|
2223
|
+
type: "buttons_url",
|
2224
|
+
value: "Кнопки со ссылками",
|
2225
|
+
buttons: [
|
2226
|
+
"https://amocrm.ru",
|
2227
|
+
"https://deppa.ru"
|
2228
|
+
]
|
2229
|
+
}
|
2230
|
+
},
|
2231
|
+
{
|
2232
|
+
handler: "goto",
|
2233
|
+
params: {
|
2234
|
+
type: "question|answer|finish",
|
2235
|
+
step: 5
|
2236
|
+
}
|
2237
|
+
}
|
2238
|
+
]
|
2239
|
+
}
|
2240
|
+
AmocrmRails::Request.salesbot(bot_id).continue(continue_id).create(body: body)
|
2241
|
+
AmocrmRails::Request.marketingbot(bot_id).continue(continue_id).create(body: body)
|
2242
|
+
```
|
1919
2243
|
## <a name="calls"></a> [Добавление звонков](https://www.amocrm.ru/developers/content/crm_platform/calls-api)
|
1920
|
-
|
2244
|
+
```ruby
|
2245
|
+
body = [
|
2246
|
+
{
|
2247
|
+
duration: 10,
|
2248
|
+
source: "example_integration",
|
2249
|
+
phone: "123123",
|
2250
|
+
link: "https://deppa.ru/audio.mp3",
|
2251
|
+
direction: "inbound",
|
2252
|
+
call_result: "Успешный разговор",
|
2253
|
+
call_status: 4
|
2254
|
+
}
|
2255
|
+
]
|
2256
|
+
response = AmocrmRails::Request.calls.create(body: body)
|
2257
|
+
p(response.body)
|
2258
|
+
calls = response.body[:_embedded][:calls]
|
2259
|
+
```
|
1921
2260
|
## <a name="salesbot"></a> [Salebot](https://www.amocrm.ru/developers/content/api/salesbot-api)
|
1922
|
-
|
2261
|
+
```ruby
|
2262
|
+
body = [
|
2263
|
+
{
|
2264
|
+
bot_id: 565,
|
2265
|
+
entity_id: 76687686,
|
2266
|
+
entity_type: 1
|
2267
|
+
}
|
2268
|
+
]
|
2269
|
+
response = AmocrmRails::Request.salesbot.run.create(body: body)
|
2270
|
+
p(response.body)
|
2271
|
+
```
|
1923
2272
|
## <a name="short_links"></a> [Короткие ссылки](https://www.amocrm.ru/developers/content/crm_platform/short_links)
|
2273
|
+
```ruby
|
2274
|
+
body = [
|
2275
|
+
{
|
2276
|
+
url:"https://deppa.ru",
|
2277
|
+
metadata:{
|
2278
|
+
entity_type:"contacts",
|
2279
|
+
entity_id:11070881
|
2280
|
+
}
|
2281
|
+
}
|
2282
|
+
]
|
2283
|
+
response = AmocrmRails::Request.short_links.create(body: body)
|
2284
|
+
p(response.body)
|
2285
|
+
short_links = response.body[:_embedded][:short_links]
|
2286
|
+
```
|
data/lib/amocrm-rails.rb
CHANGED
@@ -2,11 +2,17 @@ require 'amocrm-rails/amocrm_error'
|
|
2
2
|
require 'amocrm-rails/request'
|
3
3
|
require 'amocrm-rails/api_request'
|
4
4
|
require 'amocrm-rails/response'
|
5
|
+
require 'concern'
|
6
|
+
require 'helper'
|
5
7
|
|
6
8
|
module AmocrmRails
|
7
9
|
class << self
|
8
|
-
def generate_access_token(
|
9
|
-
|
10
|
+
def generate_access_token(**options)
|
11
|
+
user_id = AmocrmRails.try(:user_id)
|
12
|
+
client_id = options[:client_id] || AmocrmRails.client_id
|
13
|
+
client_secret = options[:client_secret] || AmocrmRails.client_secret
|
14
|
+
refresh_token = options[:refresh_token] || AmocrmRails.try(:refresh_token)
|
15
|
+
count = options[:count].to_i
|
10
16
|
params = {
|
11
17
|
client_id: client_id,
|
12
18
|
client_secret: client_secret,
|
@@ -30,12 +36,20 @@ module AmocrmRails
|
|
30
36
|
response_token = JSON.parse(response.body)
|
31
37
|
data = YAML.load_file("config/amocrm_token.yml")
|
32
38
|
response_token.each do |k, v|
|
33
|
-
|
34
|
-
|
39
|
+
if user_id.present?
|
40
|
+
data[user_id] = {} if data[user_id].nil?
|
41
|
+
data[user_id][k] = v
|
42
|
+
else
|
43
|
+
data[k] = v
|
44
|
+
end
|
45
|
+
AmocrmRails::register(k.underscore.to_sym, v)
|
35
46
|
end
|
36
47
|
File.open("config/amocrm_token.yml", 'w') { |f| YAML.dump(data, f) }
|
37
48
|
elsif count < 3 && AmocrmRails.refresh_token.present?
|
38
|
-
AmocrmRails.generate_access_token(client_id
|
49
|
+
AmocrmRails.generate_access_token(client_id: client_id,
|
50
|
+
client_secret: client_secret,
|
51
|
+
refresh_token:AmocrmRails.refresh_token,
|
52
|
+
count: count+1)
|
39
53
|
end
|
40
54
|
end
|
41
55
|
|
@@ -14,10 +14,10 @@ module AmocrmRails
|
|
14
14
|
end
|
15
15
|
parse_response(response)
|
16
16
|
rescue => e
|
17
|
-
if e.response.
|
17
|
+
if [401, 402].include?(e.response.dig(:status)) && first_time
|
18
18
|
AmocrmRails.generate_access_token
|
19
19
|
self.post(params: params, headers: headers, body: body, first_time: false)
|
20
|
-
elsif e.response.
|
20
|
+
elsif e.response.dig(:status) == 429
|
21
21
|
sleep(1.second)
|
22
22
|
self.post(params: params, headers: headers, body: body, first_time: false)
|
23
23
|
else
|
@@ -35,10 +35,10 @@ module AmocrmRails
|
|
35
35
|
end
|
36
36
|
parse_response(response)
|
37
37
|
rescue => e
|
38
|
-
if e.response.
|
38
|
+
if [401, 402].include?(e.response.dig(:status)) && first_time
|
39
39
|
AmocrmRails.generate_access_token
|
40
40
|
self.patch(params: params, headers: headers, body: body, first_time: false)
|
41
|
-
elsif e.response.try(:
|
41
|
+
elsif e.response.try(:status) == 429
|
42
42
|
sleep(1.second)
|
43
43
|
self.patch(params: params, headers: headers, body: body, first_time: false)
|
44
44
|
else
|
@@ -56,10 +56,10 @@ module AmocrmRails
|
|
56
56
|
end
|
57
57
|
parse_response(response)
|
58
58
|
rescue => e
|
59
|
-
if e.response.
|
59
|
+
if [401, 402].include?(e.response.dig(:status)) && first_time
|
60
60
|
AmocrmRails.generate_access_token
|
61
61
|
self.put(params: params, headers: headers, body: body, first_time: false)
|
62
|
-
elsif e.response.
|
62
|
+
elsif e.response.dig(:status) == 429
|
63
63
|
sleep(1.second)
|
64
64
|
self.put(params: params, headers: headers, body: body, first_time: false)
|
65
65
|
else
|
@@ -77,10 +77,10 @@ module AmocrmRails
|
|
77
77
|
end
|
78
78
|
parse_response(response)
|
79
79
|
rescue => e
|
80
|
-
if e.response.
|
80
|
+
if [401, 402].include?(e.response.dig(:status)) && first_time
|
81
81
|
AmocrmRails.generate_access_token
|
82
82
|
self.get(params: params, headers: headers, first_time: false)
|
83
|
-
elsif e.response.try(:
|
83
|
+
elsif e.response.try(:status) == 429
|
84
84
|
sleep(1.second)
|
85
85
|
self.get(params: params, headers: headers, body: body, first_time: false)
|
86
86
|
else
|
@@ -98,10 +98,10 @@ module AmocrmRails
|
|
98
98
|
end
|
99
99
|
parse_response(response)
|
100
100
|
rescue => e
|
101
|
-
if e.response.
|
101
|
+
if [401, 402].include?(e.response.dig(:status)) && first_time
|
102
102
|
AmocrmRails.generate_access_token
|
103
103
|
self.delete(params: params, headers: headers, first_time: false)
|
104
|
-
elsif e.response.try(:
|
104
|
+
elsif e.response.try(:stattus) == 429
|
105
105
|
sleep(1.second)
|
106
106
|
self.delete(params: params, headers: headers, body: body, first_time: false)
|
107
107
|
else
|
data/lib/concern.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module AmocrmRails
|
2
|
+
module Concern
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
private
|
6
|
+
|
7
|
+
def update_auth_code
|
8
|
+
if user_signed_in?
|
9
|
+
AmocrmRails::register :user_id, current_user.id
|
10
|
+
if File.exist?('config/amocrm.yml')
|
11
|
+
data = YAML.load_file('config/amocrm.yml')
|
12
|
+
return nil if data.dig(Rails.env, current_user.id).nil?
|
13
|
+
data[Rails.env][current_user.id].each do |k, v|
|
14
|
+
AmocrmRails::register k.underscore.to_sym, v
|
15
|
+
end
|
16
|
+
|
17
|
+
if File.exist?('config/amocrm_token.yml')
|
18
|
+
token_data = YAML.load_file("config/amocrm_token.yml")
|
19
|
+
token_data[current_user.id] = {} if data.dig(current_user.id).nil?
|
20
|
+
token_data[current_user.id].each do |k, v|
|
21
|
+
config::register k.underscore.to_sym, v
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
AmocrmRails.generate_access_token if AmocrmRails.access_token.nil? && AmocrmRails.code.present?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -4,10 +4,31 @@ module AmocrmRails
|
|
4
4
|
class InstallGenerator < Rails::Generators::Base
|
5
5
|
source_root File.expand_path('templates', __dir__)
|
6
6
|
|
7
|
+
class_option :with, type: :string, default: ''
|
8
|
+
|
7
9
|
def generate_install
|
8
|
-
|
10
|
+
with = options['with']
|
9
11
|
copy_file 'amocrm_token.yml', 'config/amocrm_token.yml'
|
10
|
-
|
12
|
+
|
13
|
+
if with.to_s.downcase == 'devise'
|
14
|
+
copy_file 'devise/app/controllers/amocrm_controller.rb', 'app/controllers/amocrm_controller.rb'
|
15
|
+
copy_file 'devise/app/views/amocrm/code.html.erb', 'app/views/amocrm/code.html.erb'
|
16
|
+
copy_file 'devise/app/views/amocrm/link.html.erb', 'app/views/amocrm/link.html.erb'
|
17
|
+
copy_file 'devise/config/amocrm.yml', 'config/amocrm.yml'
|
18
|
+
copy_file 'devise/config/initializers/amocrm.rb', 'config/initializers/amocrm.rb'
|
19
|
+
route "get '/amocrm' => 'amocrm#code'"
|
20
|
+
route "get '/amocrm/link' => 'amocrm#link'"
|
21
|
+
route "post '/amocrm/webhook/:name' => 'amocrm#webhook'"
|
22
|
+
|
23
|
+
inject_into_file 'app/controllers/application_controller.rb', after: "class ApplicationController < ActionController::Base\n" do <<-'RUBY'
|
24
|
+
include AmocrmRails::Concern
|
25
|
+
before_action :update_auth_code
|
26
|
+
RUBY
|
27
|
+
end
|
28
|
+
else
|
29
|
+
copy_file 'amocrm.rb', 'config/initializers/amocrm.rb'
|
30
|
+
copy_file 'amocrm.yml', 'config/amocrm.yml'
|
31
|
+
end
|
11
32
|
end
|
12
33
|
end
|
13
34
|
end
|
@@ -1,17 +1,17 @@
|
|
1
|
-
require 'amocrm'
|
1
|
+
require 'amocrm-rails'
|
2
2
|
|
3
3
|
AmocrmRails.setup do |config|
|
4
4
|
if File.exist?('config/amocrm.yml')
|
5
5
|
processed = YAML.load_file('config/amocrm.yml')[Rails.env]
|
6
6
|
|
7
7
|
processed.each do |k, v|
|
8
|
-
config::register k.underscore.to_sym, v
|
8
|
+
config::register k.to_s.underscore.to_sym, v
|
9
9
|
end
|
10
10
|
|
11
11
|
if File.exist?('config/amocrm_token.yml')
|
12
12
|
token_data = YAML.load_file("config/amocrm_token.yml")
|
13
13
|
token_data.each do |k, v|
|
14
|
-
config::register k.underscore.to_sym, v
|
14
|
+
config::register k.to_s.underscore.to_sym, v
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -2,14 +2,11 @@ defaults: &defaults
|
|
2
2
|
CLIENT_ID: '***'
|
3
3
|
CLIENT_SECRET: '***'
|
4
4
|
CODE: '***'
|
5
|
-
redirect_uri: https://yourdomain.ru
|
5
|
+
redirect_uri: https://yourdomain.ru/amocrm
|
6
6
|
api_endpoint: https://yourdomain.amocrm.ru
|
7
|
-
URL_TOKEN:
|
8
|
-
REDIRECT_URI: 'https://yourdomain.com'
|
7
|
+
URL_TOKEN: https://yourdomain.amocrm.ru/oauth2/access_token
|
9
8
|
production:
|
10
9
|
<<: *defaults
|
11
|
-
URL_TOKEN: 'https://yourdomain.amocrm.ru/oauth2/access_token'
|
12
|
-
REDIRECT_URI: 'https://yourdomain.ru'
|
13
10
|
development:
|
14
11
|
<<: *defaults
|
15
12
|
test:
|
data/lib/generators/amocrm_rails/install/templates/devise/app/controllers/amocrm_controller.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
class AmocrmController < ApplicationController
|
2
|
+
before_action :authenticate_user!, except: [:webhook]
|
3
|
+
|
4
|
+
def link
|
5
|
+
end
|
6
|
+
|
7
|
+
def code
|
8
|
+
if current_user.id == params[:state].to_i
|
9
|
+
if File.exist?('config/amocrm.yml')
|
10
|
+
data = YAML.load_file('config/amocrm.yml')
|
11
|
+
data[Rails.env][current_user.id] = {} if data[Rails.env][current_user.id].nil?
|
12
|
+
params.each do |k, v|
|
13
|
+
data[Rails.env][current_user.id][k] = v
|
14
|
+
AmocrmRails::register k.to_s.underscore.to_sym, v
|
15
|
+
end
|
16
|
+
File.open("config/amocrm.yml", 'w') { |f| YAML.dump(data, f) }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
@code = params[:code]
|
20
|
+
response = AmocrmRails::Request.account.retrieve(params: {
|
21
|
+
with: 'amojo_id,amojo_rights,users_groups,task_types,version,entity_names,datetime_settings'
|
22
|
+
})
|
23
|
+
@account = response.body
|
24
|
+
end
|
25
|
+
|
26
|
+
def webhook
|
27
|
+
webhook_name = params[:name]
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def authenticate_user!
|
33
|
+
unless user_signed_in?
|
34
|
+
redirect_to new_user_session_path
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'amocrm-rails'
|
2
|
+
|
3
|
+
AmocrmRails.setup do |config|
|
4
|
+
if File.exist?('config/amocrm.yml')
|
5
|
+
processed = YAML.load_file('config/amocrm.yml')[Rails.env]
|
6
|
+
|
7
|
+
processed.each do |k, v|
|
8
|
+
config::register k.to_s.underscore.to_sym, v
|
9
|
+
end
|
10
|
+
|
11
|
+
config::Request.timeout = 60
|
12
|
+
config::Request.open_timeout = 60
|
13
|
+
config::Request.symbolize_keys = true
|
14
|
+
config::Request.debug = false
|
15
|
+
end
|
16
|
+
end
|
data/lib/helper.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: amocrm-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pavel Osetrov
|
@@ -52,11 +52,18 @@ files:
|
|
52
52
|
- lib/amocrm-rails/request.rb
|
53
53
|
- lib/amocrm-rails/response.rb
|
54
54
|
- lib/amocrm-rails/version.rb
|
55
|
+
- lib/concern.rb
|
55
56
|
- lib/generators/amocrm_rails/install/USAGE
|
56
57
|
- lib/generators/amocrm_rails/install/install_generator.rb
|
57
58
|
- lib/generators/amocrm_rails/install/templates/amocrm.rb
|
58
59
|
- lib/generators/amocrm_rails/install/templates/amocrm.yml
|
59
60
|
- lib/generators/amocrm_rails/install/templates/amocrm_token.yml
|
61
|
+
- lib/generators/amocrm_rails/install/templates/devise/app/controllers/amocrm_controller.rb
|
62
|
+
- lib/generators/amocrm_rails/install/templates/devise/app/views/amocrm/code.html.erb
|
63
|
+
- lib/generators/amocrm_rails/install/templates/devise/app/views/amocrm/link.html.erb
|
64
|
+
- lib/generators/amocrm_rails/install/templates/devise/config/amocrm.rb
|
65
|
+
- lib/generators/amocrm_rails/install/templates/devise/config/initializers/amocrm.rb
|
66
|
+
- lib/helper.rb
|
60
67
|
homepage: https://github.com/osetrov/amocrm
|
61
68
|
licenses:
|
62
69
|
- MIT
|