amo_crm 0.2.2

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.
Files changed (150) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +28 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +4 -0
  5. data/CHANGELOG.md +22 -0
  6. data/Gemfile +4 -0
  7. data/Guardfile +29 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +1 -0
  10. data/Rakefile +14 -0
  11. data/amo_crm.gemspec +41 -0
  12. data/dump_amocrm_account.rb +7 -0
  13. data/lib/amo_crm.rb +31 -0
  14. data/lib/amo_crm/client.rb +98 -0
  15. data/lib/amo_crm/client/error.rb +18 -0
  16. data/lib/amo_crm/client/errors.rb +16 -0
  17. data/lib/amo_crm/entities.rb +14 -0
  18. data/lib/amo_crm/entities/account.rb +7 -0
  19. data/lib/amo_crm/entities/attachment_document.rb +16 -0
  20. data/lib/amo_crm/entities/attribute.rb +71 -0
  21. data/lib/amo_crm/entities/attribute_metadata.rb +38 -0
  22. data/lib/amo_crm/entities/barcode.rb +19 -0
  23. data/lib/amo_crm/entities/base.rb +5 -0
  24. data/lib/amo_crm/entities/collection.rb +12 -0
  25. data/lib/amo_crm/entities/common.rb +15 -0
  26. data/lib/amo_crm/entities/common_object.rb +27 -0
  27. data/lib/amo_crm/entities/company.rb +30 -0
  28. data/lib/amo_crm/entities/company_concern.rb +20 -0
  29. data/lib/amo_crm/entities/consignment.rb +22 -0
  30. data/lib/amo_crm/entities/contact.rb +29 -0
  31. data/lib/amo_crm/entities/contract.rb +2 -0
  32. data/lib/amo_crm/entities/country.rb +10 -0
  33. data/lib/amo_crm/entities/custom_entity.rb +18 -0
  34. data/lib/amo_crm/entities/custom_entity_metadata.rb +36 -0
  35. data/lib/amo_crm/entities/custom_field.rb +6 -0
  36. data/lib/amo_crm/entities/custom_field_definition.rb +13 -0
  37. data/lib/amo_crm/entities/custom_field_value.rb +5 -0
  38. data/lib/amo_crm/entities/custom_fields.rb +24 -0
  39. data/lib/amo_crm/entities/custom_fields_definition.rb +4 -0
  40. data/lib/amo_crm/entities/customer_order.rb +51 -0
  41. data/lib/amo_crm/entities/customer_order_position.rb +22 -0
  42. data/lib/amo_crm/entities/embedded_entity_metadata.rb +18 -0
  43. data/lib/amo_crm/entities/error.rb +13 -0
  44. data/lib/amo_crm/entities/feature.rb +23 -0
  45. data/lib/amo_crm/entities/good.rb +34 -0
  46. data/lib/amo_crm/entities/good_folder.rb +10 -0
  47. data/lib/amo_crm/entities/good_ref.rb +12 -0
  48. data/lib/amo_crm/entities/image.rb +21 -0
  49. data/lib/amo_crm/entities/images.rb +10 -0
  50. data/lib/amo_crm/entities/lead.rb +28 -0
  51. data/lib/amo_crm/entities/my_company.rb +12 -0
  52. data/lib/amo_crm/entities/page.rb +5 -0
  53. data/lib/amo_crm/entities/price.rb +15 -0
  54. data/lib/amo_crm/entities/price_type.rb +13 -0
  55. data/lib/amo_crm/entities/sale_price.rb +18 -0
  56. data/lib/amo_crm/entities/sale_prices.rb +10 -0
  57. data/lib/amo_crm/entities/slot.rb +10 -0
  58. data/lib/amo_crm/entities/stock_to.rb +33 -0
  59. data/lib/amo_crm/entities/warehouse.rb +15 -0
  60. data/lib/amo_crm/entities/workflow.rb +11 -0
  61. data/lib/amo_crm/entities/workflow_state.rb +8 -0
  62. data/lib/amo_crm/entities/xml_fix.rb +14 -0
  63. data/lib/amo_crm/errors.rb +1 -0
  64. data/lib/amo_crm/resources.rb +18 -0
  65. data/lib/amo_crm/resources/account.rb +30 -0
  66. data/lib/amo_crm/resources/base.rb +149 -0
  67. data/lib/amo_crm/resources/companies.rb +27 -0
  68. data/lib/amo_crm/resources/contacts.rb +23 -0
  69. data/lib/amo_crm/resources/custom_entity_metadata.rb +18 -0
  70. data/lib/amo_crm/resources/custom_field.rb +28 -0
  71. data/lib/amo_crm/resources/embedded_entity_metadata.rb +20 -0
  72. data/lib/amo_crm/resources/embedded_entity_metadata_indexed.rb +7 -0
  73. data/lib/amo_crm/resources/indexed.rb +89 -0
  74. data/lib/amo_crm/resources/leads.rb +31 -0
  75. data/lib/amo_crm/resources/stock.rb +36 -0
  76. data/lib/amo_crm/resources/subresource.rb +21 -0
  77. data/lib/amo_crm/resources/where_filter.rb +26 -0
  78. data/lib/amo_crm/response.rb +7 -0
  79. data/lib/amo_crm/universe.rb +44 -0
  80. data/lib/amo_crm/version.rb +3 -0
  81. data/scripts/rest.sh +25 -0
  82. data/spec/fixtures/302.raw +15 -0
  83. data/spec/fixtures/400.raw +8 -0
  84. data/spec/fixtures/401.html +1 -0
  85. data/spec/fixtures/401_2.html +1 -0
  86. data/spec/fixtures/405.raw +9 -0
  87. data/spec/fixtures/500.raw +8 -0
  88. data/spec/fixtures/502.raw +8 -0
  89. data/spec/fixtures/Consignment_list_0.raw +14 -0
  90. data/spec/fixtures/Consignment_list_1000.raw +14 -0
  91. data/spec/fixtures/Country_list.raw +14 -0
  92. data/spec/fixtures/CustomEntityMetadata_list.raw +14 -0
  93. data/spec/fixtures/CustomEntity_list.raw +14 -0
  94. data/spec/fixtures/CustomEntity_list_bad_chars.raw +17 -0
  95. data/spec/fixtures/EmbeddedEntityMetadata_list.raw +15 -0
  96. data/spec/fixtures/Feature_list.raw +14 -0
  97. data/spec/fixtures/Feature_list_1000.raw +14 -0
  98. data/spec/fixtures/Good_WithManyAttributes.raw +13 -0
  99. data/spec/fixtures/Good_e932ebe1-2e22-11e4-9406-002590a28eca.raw +12 -0
  100. data/spec/fixtures/Good_eb77ad57-2e22-11e4-4030-002590a28eca.raw +12 -0
  101. data/spec/fixtures/Goods_list.raw +14 -0
  102. data/spec/fixtures/Metadata_list.raw +14 -0
  103. data/spec/fixtures/PriceType_list.raw +14 -0
  104. data/spec/fixtures/Stock.raw +11 -0
  105. data/spec/fixtures/Stock_showConsignments.raw +11 -0
  106. data/spec/fixtures/Uom_list.raw +14 -0
  107. data/spec/fixtures/Warehouse_list.raw +14 -0
  108. data/spec/fixtures/Workflow_list.raw +15 -0
  109. data/spec/fixtures/attribute_boolean.xml +6 -0
  110. data/spec/fixtures/attribute_dictionary.xml +5 -0
  111. data/spec/fixtures/attribute_double.xml +6 -0
  112. data/spec/fixtures/attribute_file.xml +12 -0
  113. data/spec/fixtures/attribute_long.xml +6 -0
  114. data/spec/fixtures/attribute_text.xml +5 -0
  115. data/spec/fixtures/attribute_time.xml +6 -0
  116. data/spec/fixtures/attribute_url.xml +6 -0
  117. data/spec/fixtures/bad_chars.xml +6 -0
  118. data/spec/fixtures/customer_order.xml +28 -0
  119. data/spec/fixtures/good_with_attributes.raw +12 -0
  120. data/spec/fixtures/good_with_image.xml +39 -0
  121. data/spec/fixtures/resource_forbidden.raw +9 -0
  122. data/spec/fixtures/wrong_password.raw +9 -0
  123. data/spec/fixtures/wrong_type.raw +70 -0
  124. data/spec/fixtures/wrong_user.raw +9 -0
  125. data/spec/lib/amocrm/client/errors_spec.rb +102 -0
  126. data/spec/lib/amocrm/entities/attribute_metadata_spec.rb +30 -0
  127. data/spec/lib/amocrm/entities/attribute_spec.rb +36 -0
  128. data/spec/lib/amocrm/entities/country_spec.rb +25 -0
  129. data/spec/lib/amocrm/entities/custom_entity_metadata_spec.rb +34 -0
  130. data/spec/lib/amocrm/entities/custom_entity_spec.rb +34 -0
  131. data/spec/lib/amocrm/entities/customer_order_position_spec.rb +35 -0
  132. data/spec/lib/amocrm/entities/customer_order_spec.rb +58 -0
  133. data/spec/lib/amocrm/entities/good_spec.rb +55 -0
  134. data/spec/lib/amocrm/resources/base_spec.rb +61 -0
  135. data/spec/lib/amocrm/resources/countries_spec.rb +22 -0
  136. data/spec/lib/amocrm/resources/custom_entity_metadata_spec.rb +13 -0
  137. data/spec/lib/amocrm/resources/embedded_entity_metadata_indexed_spec.rb +20 -0
  138. data/spec/lib/amocrm/resources/embedded_entity_metadata_spec.rb +11 -0
  139. data/spec/lib/amocrm/resources/good_folders_spec.rb +17 -0
  140. data/spec/lib/amocrm/resources/indexed_spec.rb +61 -0
  141. data/spec/lib/amocrm/resources/stock_spec.rb +63 -0
  142. data/spec/lib/amocrm/resources/subresource_spec.rb +13 -0
  143. data/spec/lib/amocrm/resources/warehouses_spec.rb +20 -0
  144. data/spec/lib/amocrm/resources/workflows_spec.rb +21 -0
  145. data/spec/lib/amocrm/resources_spec.rb +10 -0
  146. data/spec/lib/amocrm/universe_spec.rb +53 -0
  147. data/spec/lib/amocrm_spec.rb +8 -0
  148. data/spec/spec_helper.rb +106 -0
  149. data/spec/support/resource.rb +72 -0
  150. metadata +500 -0
@@ -0,0 +1,13 @@
1
+ module AmoCRM::Entities
2
+ class Error < Base
3
+ include HappyMapper
4
+
5
+ tag 'error'
6
+
7
+ element :uid, String
8
+ element :moment, Time
9
+ element :message, String
10
+
11
+ element :stack, String
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ module AmoCRM::Entities
2
+ class Feature < Base
3
+ include CommonObject
4
+
5
+ tag 'feature'
6
+
7
+ attribute :goodUuid, String
8
+
9
+ attribute :archived, Boolean
10
+ attribute :isDefault, Boolean
11
+
12
+ element :shared, Boolean
13
+
14
+ has_many :attributes, AmoCRM::Entities::Attribute
15
+ has_many :barcodes, AmoCRM::Entities::Barcode
16
+
17
+ def good universe
18
+ cache :good, universe do
19
+ universe.good.find goodUuid
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,34 @@
1
+ module AmoCRM::Entities
2
+ class Good < Base
3
+ include CommonObject
4
+ include AmoCRM::Entities::XmlFix
5
+
6
+ tag 'good'
7
+
8
+ attribute :isSerialTrackable, Boolean
9
+ attribute :buyPrice, Float
10
+ attribute :buyCurrencyUuid, String
11
+ attribute :minPrice, Float
12
+ attribute :salePrice, Float
13
+ attribute :saleCurrencyUuid, String
14
+ attribute :weight, Float
15
+ attribute :volume, Float
16
+ attribute :parentUuid, String
17
+ attribute :productCode, String
18
+ attribute :uomUuid, String
19
+
20
+ element :code, String
21
+ element :salePrices, AmoCRM::Entities::SalePrices
22
+
23
+ has_many :attributes, Attribute
24
+ element :images, AmoCRM::Entities::Images
25
+ element :barcode, AmoCRM::Entities::Barcode
26
+ # preferences
27
+
28
+ def features universe
29
+ cache :features, universe do
30
+ universe.features.where goodUuid: uuid
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,10 @@
1
+ module AmoCRM::Entities
2
+ class GoodFolder < Base
3
+ include CommonObject
4
+
5
+ tag 'goodFolder'
6
+
7
+ attribute :productCode, String
8
+ attribute :parentUuid, String
9
+ end
10
+ end
@@ -0,0 +1,12 @@
1
+ module AmoCRM::Entities
2
+ class GoodRef < Base
3
+ include HappyMapper
4
+
5
+ tag 'goodRef'
6
+
7
+ attribute :uuid, String
8
+ attribute :name, String
9
+ attribute :code, String
10
+ attribute :objectType, String
11
+ end
12
+ end
@@ -0,0 +1,21 @@
1
+ module AmoCRM::Entities
2
+ class Image < Base
3
+ include HappyMapper
4
+ include AmoCRM::Entities::XmlFix
5
+
6
+ tag 'image'
7
+
8
+ attribute :created, Time
9
+ attribute :updated, Time
10
+ attribute :updatedBy, String
11
+ attribute :name, String
12
+ attribute :tinyUuid, String
13
+ attribute :filename, String
14
+ attribute :miniatureUuid, String
15
+
16
+ attribute :accountUuid, String
17
+ attribute :accountId, String
18
+ attribute :uuid, String
19
+ attribute :externalcode, String
20
+ end
21
+ end
@@ -0,0 +1,10 @@
1
+ module AmoCRM::Entities
2
+ class Images < Base
3
+ include HappyMapper
4
+ include AmoCRM::Entities::XmlFix
5
+
6
+ tag 'images'
7
+
8
+ has_many :image, AmoCRM::Entities::Image
9
+ end
10
+ end
@@ -0,0 +1,28 @@
1
+ module AmoCRM::Entities
2
+ class Lead
3
+ include Virtus.model
4
+ attribute :name, String
5
+ attribute :date_create, Time
6
+ attribute :last_modified, Time
7
+ attribute :status_id, Integer
8
+ attribute :price, Integer
9
+ attribute :request_id, Integer
10
+ attribute :tags, Array[String]
11
+ # responsible_user_id
12
+
13
+
14
+ def attributes_for_update
15
+ {
16
+ name: name,
17
+ date_create: date_create.to_i,
18
+ last_modified: last_modified.to_i,
19
+ request_id: request_id,
20
+ # status_id: status_id,
21
+ price: price,
22
+ custom_fields: custom_fields,
23
+ # tags: tags,
24
+ visitor_uid: visitor_uid,
25
+ }
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,12 @@
1
+ module AmoCRM::Entities
2
+ # https://online.moysklad.ru/exchange/rest/ms/xml/MyCompany/list
3
+ class MyCompany < Base
4
+ include AmoCRM::Entities::CompanyConcern
5
+
6
+ tag 'myCompany'
7
+
8
+ attribute :director, String
9
+ attribute :chiefAccountant, String
10
+
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ module AmoCRM::Entities
2
+ class Page < Struct.new(:items, :total, :start, :count)
3
+
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ module AmoCRM::Entities
2
+ class Price < Base
3
+ include HappyMapper
4
+ include AmoCRM::Entities::XmlFix
5
+
6
+ def self.from_money money
7
+ p = new
8
+ p.sumInCurrency = p.sum = money.cents
9
+ p
10
+ end
11
+
12
+ attribute :sumInCurrency, Float
13
+ attribute :sum, Float
14
+ end
15
+ end
@@ -0,0 +1,13 @@
1
+ module AmoCRM::Entities
2
+ class PriceType < Base
3
+ include CommonObject
4
+ include AmoCRM::Entities::XmlFix
5
+ tag 'priceType'
6
+
7
+ attribute :updated, Time
8
+ attribute :updatedBy, String
9
+ attribute :name, String
10
+
11
+ attribute :index, Integer
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ module AmoCRM::Entities
2
+ class SalePrice < Base
3
+ include HappyMapper
4
+ include AmoCRM::Entities::XmlFix
5
+
6
+ tag 'price'
7
+
8
+ attribute :currencyUuid, String
9
+ attribute :priceTypeUuid, String
10
+ attribute :value, Float
11
+
12
+ def priceType universe
13
+ cache :priceType, universe do
14
+ universe.price_types.find priceTypeUuid
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,10 @@
1
+ module AmoCRM::Entities
2
+ class SalePrices < Base
3
+ include HappyMapper
4
+ include AmoCRM::Entities::XmlFix
5
+
6
+ tag 'salePrices'
7
+
8
+ has_many :price, AmoCRM::Entities::SalePrice
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module AmoCRM::Entities
2
+ # https://online.moysklad.ru/exchange/rest/ms/xml/Warehouse/list
3
+ class Slot < Base
4
+ include HappyMapper
5
+ include AmoCRM::Entities::XmlFix
6
+
7
+ tag 'slot'
8
+
9
+ end
10
+ end
@@ -0,0 +1,33 @@
1
+ module AmoCRM::Entities
2
+ class StockTO < Base
3
+ include HappyMapper
4
+ include AmoCRM::Entities::XmlFix
5
+
6
+ tag 'stockTO'
7
+
8
+ attribute :productCode, String
9
+ attribute :uomName, String
10
+
11
+ attribute :quantity, Float # Доступный остаток на склада
12
+ attribute :reserve, Float # Сколько в резерве
13
+ attribute :stock, Float # Остаток на складе не считая резерва
14
+
15
+ attribute :inTransit, Float
16
+ attribute :sumTotal, Float
17
+ attribute :saleAmount, Float
18
+ attribute :minimumBalance, Float
19
+ attribute :category, String
20
+ attribute :externalCode, String
21
+ attribute :parentUuid, String
22
+ attribute :defaultConsignment, Boolean
23
+ attribute :salePrice, Float
24
+
25
+ # Есть только при showConsignments
26
+ attribute :consignmentName, String
27
+ attribute :consignmentUuid, String
28
+
29
+ element :goodRef, AmoCRM::Entities::GoodRef
30
+
31
+ end
32
+ end
33
+
@@ -0,0 +1,15 @@
1
+ module AmoCRM::Entities
2
+ # https://online.moysklad.ru/exchange/rest/ms/xml/Warehouse/list
3
+ class Warehouse < Base
4
+ include CommonObject
5
+
6
+ tag 'warehouse'
7
+
8
+ attribute :agentUuid, String
9
+ attribute :archived, Boolean
10
+ attribute :code, String
11
+
12
+ element :contact, Contact
13
+ has_many :slots, Slot
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ module AmoCRM::Entities
2
+ class Workflow < Base
3
+ include CommonObject
4
+ include AmoCRM::Entities::XmlFix
5
+
6
+ element :code, String
7
+ element :uuid, String
8
+
9
+ has_many :states, AmoCRM::Entities::WorkflowState, tag: :state
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ module AmoCRM::Entities
2
+ class WorkflowState < Base
3
+ include CommonObject
4
+ include AmoCRM::Entities::XmlFix
5
+
6
+ element :uuid, String
7
+ end
8
+ end
@@ -0,0 +1,14 @@
1
+ module AmoCRM::Entities::XmlFix
2
+ extend ::ActiveSupport::Concern
3
+
4
+ def to_xml builder = nil,default_namespace = nil,tag_from_parent = nil
5
+ unless builder
6
+ builder = Nokogiri::XML::Builder.new(encoding: 'utf-8')
7
+ write_out_to_xml = true
8
+ end
9
+
10
+ result = super builder, default_namespace, tag_from_parent
11
+
12
+ write_out_to_xml ? result.to_xml : result
13
+ end
14
+ end
@@ -0,0 +1 @@
1
+ # nothing
@@ -0,0 +1,18 @@
1
+ module AmoCRM::Resources
2
+ mattr_accessor :resources
3
+
4
+ extend ActiveSupport::Autoload
5
+
6
+ def self.register_resource resource_class
7
+ self.resources ||= []
8
+ self.resources << resource_class
9
+ end
10
+
11
+ require_relative 'resources/base'
12
+ require_relative 'resources/indexed'
13
+ require_relative 'resources/companies'
14
+ require_relative 'resources/leads'
15
+ require_relative 'resources/contacts'
16
+ require_relative 'resources/account'
17
+ require_relative 'resources/custom_field'
18
+ end
@@ -0,0 +1,30 @@
1
+ module AmoCRM::Resources
2
+ class Account < Base
3
+
4
+ def current
5
+ get
6
+ end
7
+
8
+ def get
9
+ parse client.get 'accounts/current'
10
+ end
11
+
12
+ def self.entity_class
13
+ AmoCRM::Entities::Account
14
+ end
15
+
16
+ def response_key
17
+ 'account'
18
+ end
19
+
20
+ def self.resource_name
21
+ :account
22
+ end
23
+
24
+ private
25
+
26
+ def parse data
27
+ self.class.entity_class.new data[response_key]
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,149 @@
1
+ module AmoCRM::Resources
2
+ class Base
3
+ LIMIT_ROWS = 500
4
+
5
+ def self.inherited superclass
6
+ super
7
+ AmoCRM::Resources.register_resource superclass
8
+ end
9
+
10
+ # Возвращает этот-же ресурс только индексированный
11
+ #
12
+ # @return [AmoCRM::Resources::Indexed]
13
+ def self.indexed *args
14
+ # AmoCRM::Resources::Indexed.new new(*args)
15
+ new(*args)
16
+ end
17
+
18
+ def initialize client: nil
19
+ raise "Должен быть AmoCRM::Client" unless client.is_a? AmoCRM::Client
20
+ @client = client
21
+ end
22
+
23
+ def all
24
+ buffer = []
25
+ offset = 0
26
+ list = nil
27
+
28
+ while offset==0 || list.present?
29
+ list = client.get(list_path, limit_offset: offset, limit_rows: LIMIT_ROWS).contacts
30
+ offset += LIMIT_ROWS
31
+ buffer += list
32
+ end
33
+
34
+ rescue AmoCRM::Client::Error => err
35
+ raise err unless err.state == 204
36
+ buffer
37
+ end
38
+
39
+ # Возвращает список элементов как есть
40
+ #
41
+ # @return [Array of AmoCRM::Entities::Base]
42
+ def list params={}
43
+ parse_list client.get list_path, params
44
+ end
45
+
46
+ # Возвращает страницу со списком элементов
47
+ #
48
+ # @return [AmoCRM::Entities::Page]
49
+ def page params={}
50
+ parse_page client.get list_path, params
51
+ end
52
+
53
+ # Забираем элемент по id
54
+ #
55
+ # @return [AmoCRM::Entities::Base]
56
+ def get id=nil
57
+ parse client.get get_path, id: id
58
+ end
59
+
60
+ # Модифицируем элемент по id
61
+ #
62
+ # @return [AmoCRM::Entities::Base]
63
+ def update model
64
+ raise "Должна быть модель типа AmoCRM::Entities::Base" unless model.is_a? AmoCRM::Entities::Base
65
+ client.post set_path, model_to_request(model)
66
+ end
67
+
68
+ # Создаем запись
69
+ #
70
+ # @param [AmoCRM::Entities::Base]
71
+ #
72
+ # Возвращается созданная на сервере сущность
73
+ #
74
+ # @return [AmoCRM::Entities::Base]
75
+ def create model
76
+ raise "Должна быть модель типа AmoCRM::Entities::Base" unless model.is_a? AmoCRM::Entities::Base
77
+ client.post set_path, model_to_request(model, :add)
78
+ end
79
+
80
+ # Удаляем запись по id
81
+ #
82
+ # @param id
83
+ def delete id
84
+ client.delete get_path id
85
+ end
86
+
87
+ def self.type
88
+ ActiveSupport::Inflector.singularize name.split('::').last.to_sym
89
+ end
90
+
91
+ def self.resource_name
92
+ ActiveSupport::Inflector.underscore ActiveSupport::Inflector.pluralize type
93
+ end
94
+
95
+ def self.entity_class
96
+ ActiveSupport::Inflector.constantize "AmoCRM::Entities::#{type.to_s}"
97
+ end
98
+
99
+ private
100
+
101
+ attr_reader :client
102
+
103
+ def model_to_request(model, command=:update)
104
+ {
105
+ request: {
106
+ response_key => {
107
+ command => [model.attributes_for_update]
108
+ }
109
+ }
110
+ }
111
+ end
112
+
113
+ def parse data
114
+ self.class.entity_class.new data[response_key].first
115
+ end
116
+
117
+ def parse_list content
118
+ content[response_key].map do |data|
119
+ self.class.entity_class.new data
120
+ end
121
+ end
122
+
123
+ def parse_content content
124
+ content
125
+ end
126
+
127
+ def parse_page content
128
+ col = AmoCRM::Entities::Collection.parse parse_content content
129
+
130
+ # TODO Парсится два раза. Оптимизировать. Например сделать динамические CollectionFeature
131
+ # и парсить через них
132
+
133
+ items = parse content
134
+ AmoCRM::Entities::Page.new items, col.total, col.start, col.count
135
+ end
136
+
137
+ def get_path
138
+ list_path
139
+ end
140
+
141
+ def set_path
142
+ raise 'not implemented'
143
+ end
144
+
145
+ def list_path
146
+ raise 'not implemented'
147
+ end
148
+ end
149
+ end