moysklad 0.2.1 → 0.3.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.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +1 -0
  4. data/README.md +14 -3
  5. data/lib/moysklad.rb +3 -2
  6. data/lib/moysklad/client.rb +37 -10
  7. data/lib/moysklad/client/errors.rb +60 -30
  8. data/lib/moysklad/entities.rb +17 -21
  9. data/lib/moysklad/entities/assortment.rb +6 -0
  10. data/lib/moysklad/entities/attachment_document.rb +16 -0
  11. data/lib/moysklad/entities/attribute.rb +114 -37
  12. data/lib/moysklad/entities/attribute_metadata.rb +9 -31
  13. data/lib/moysklad/entities/attribute_value.rb +19 -0
  14. data/lib/moysklad/entities/barcode.rb +10 -4
  15. data/lib/moysklad/entities/base.rb +23 -8
  16. data/lib/moysklad/entities/bundle.rb +39 -0
  17. data/lib/moysklad/entities/characteristic.rb +6 -0
  18. data/lib/moysklad/entities/characteristic_metadata.rb +6 -0
  19. data/lib/moysklad/entities/collection.rb +30 -7
  20. data/lib/moysklad/entities/collection_meta.rb +11 -0
  21. data/lib/moysklad/entities/common_object.rb +0 -2
  22. data/lib/moysklad/entities/company_settings_metadata.rb +28 -0
  23. data/lib/moysklad/entities/consignment.rb +19 -17
  24. data/lib/moysklad/entities/context.rb +9 -0
  25. data/lib/moysklad/entities/counterparty.rb +18 -0
  26. data/lib/moysklad/entities/currency.rb +29 -0
  27. data/lib/moysklad/entities/custom_entity.rb +20 -10
  28. data/lib/moysklad/entities/custom_entity_metadata.rb +7 -32
  29. data/lib/moysklad/entities/customer_order.rb +116 -23
  30. data/lib/moysklad/entities/customer_order_position.rb +10 -18
  31. data/lib/moysklad/entities/employee.rb +7 -0
  32. data/lib/moysklad/entities/entity.rb +42 -0
  33. data/lib/moysklad/entities/good_folder.rb +1 -0
  34. data/lib/moysklad/entities/group.rb +7 -0
  35. data/lib/moysklad/entities/image.rb +17 -0
  36. data/lib/moysklad/entities/images.rb +10 -0
  37. data/lib/moysklad/entities/meta.rb +14 -0
  38. data/lib/moysklad/entities/organization.rb +19 -0
  39. data/lib/moysklad/entities/owner.rb +4 -0
  40. data/lib/moysklad/entities/price.rb +5 -8
  41. data/lib/moysklad/entities/price_type.rb +2 -8
  42. data/lib/moysklad/entities/product.rb +54 -0
  43. data/lib/moysklad/entities/productfolder.rb +13 -0
  44. data/lib/moysklad/entities/rate.rb +9 -0
  45. data/lib/moysklad/entities/resource_metadata.rb +13 -0
  46. data/lib/moysklad/entities/service.rb +28 -0
  47. data/lib/moysklad/entities/shortcut.rb +11 -0
  48. data/lib/moysklad/entities/store.rb +10 -0
  49. data/lib/moysklad/entities/time.rb +13 -0
  50. data/lib/moysklad/entities/uom.rb +7 -0
  51. data/lib/moysklad/entities/variant.rb +51 -0
  52. data/lib/moysklad/entities/workflow.rb +11 -0
  53. data/lib/moysklad/entities/workflow_state.rb +8 -0
  54. data/lib/moysklad/error.rb +1 -0
  55. data/lib/moysklad/resources.rb +9 -7
  56. data/lib/moysklad/resources/assortments.rb +14 -0
  57. data/lib/moysklad/resources/base.rb +32 -44
  58. data/lib/moysklad/resources/custom_entities.rb +27 -0
  59. data/lib/moysklad/resources/custom_entity_metadata.rb +12 -8
  60. data/lib/moysklad/resources/embedded_entity_metadata.rb +0 -1
  61. data/lib/moysklad/resources/indexed.rb +23 -35
  62. data/lib/moysklad/resources/indexed_cache.rb +36 -0
  63. data/lib/moysklad/resources/load_all.rb +21 -0
  64. data/lib/moysklad/resources/products.rb +10 -0
  65. data/lib/moysklad/resources/where_filter.rb +0 -1
  66. data/lib/moysklad/universe.rb +16 -2
  67. data/lib/moysklad/version.rb +1 -1
  68. data/moysklad.gemspec +3 -1
  69. data/scripts/rest.sh +5 -2
  70. data/spec/fixtures/Good_WithManyAttributes.raw +13 -0
  71. data/spec/fixtures/Workflow_list.raw +15 -0
  72. data/spec/fixtures/good_with_image.xml +39 -0
  73. data/spec/lib/moysklad/entities/customer_order_spec.rb +7 -2
  74. data/spec/lib/moysklad/entities/good_spec.rb +9 -0
  75. data/spec/lib/moysklad/resources/workflows_spec.rb +21 -0
  76. data/spec/spec_helper.rb +2 -1
  77. data/test.rb +177 -0
  78. metadata +97 -44
  79. data/lib/moysklad/entities/common.rb +0 -15
  80. data/lib/moysklad/entities/feature.rb +0 -20
  81. data/lib/moysklad/entities/good.rb +0 -34
  82. data/lib/moysklad/entities/stock_to.rb +0 -33
  83. data/lib/moysklad/entities/warehouse.rb +0 -15
  84. data/lib/moysklad/entities/xml_fix.rb +0 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0d4466dae399f6e8ec4819ce0c42eb53c9efafb6
4
- data.tar.gz: 6652461f2c0a089662cbe54e608da6f9e500e6a1
3
+ metadata.gz: 0434de2e989bb1cb0ca34205101ee8c0e978540b
4
+ data.tar.gz: ccd6cc1de782b6baf31c331b7e20fe9d7a5c5698
5
5
  SHA512:
6
- metadata.gz: 8400a264b733e8eb015d072de499eb6f0896e15a6b1f7d2f095d5c2bc9968c23ce6710db3853b08e1a916b025267c21277dc6a7a16bebf4ff5c4cf57cc29d121
7
- data.tar.gz: 32ba29c475f85b439b3f5239225c854762c93988d80d332112d163b02a7a7103ead308a1458ad964f555db63f394e5223780aad79a7bd798a5d5fefb3b6ad812
6
+ metadata.gz: 9beac30a1c510af7d1aff68e5a24ede6d24ec6cf86fdee7486e0e6826c5410a9b0212523ea649076f6575935af3c7ad751c01c58f78e086a54f77cdc9bd9970b
7
+ data.tar.gz: cf62d29570bae5e6f4dfae85ee1ca4f283a55a95e28a7b898c1f2bb768d530a011aaae5f72b5ec9a9880b66d310f197788861e62e08ce835e2f9276c3276090c
data/.gitignore CHANGED
@@ -1,4 +1,5 @@
1
1
  *.gem
2
+ .byebug_history
2
3
  *.rbc
3
4
  tags
4
5
  gems.tags
@@ -2,3 +2,4 @@ language: ruby
2
2
  rvm:
3
3
  - 2.0.0
4
4
  - 2.1.0
5
+ - 2.2.0
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Ruby-клиент для REST XML API Moysklad
2
2
 
3
- [![Build Status](https://travis-ci.org/BrandyMint/moysklad.svg)](https://travis-ci.org/BrandyMint/moysklad)
3
+ [![Build Status](https://travis-ci.org/BrandyMint/moysklad.svg)](https://travis-ci.org/dapi/moysklad)
4
4
  [![Dependency Status](https://www.versioneye.com/user/projects/548225818674a4b5b90004dd/badge.svg?style=flat)](https://www.versioneye.com/user/projects/548225818674a4b5b90004dd)
5
- [![Code Climate](https://codeclimate.com/github/BrandyMint/moysklad/badges/gpa.svg)](https://codeclimate.com/github/BrandyMint/moysklad)
5
+ [![Code Climate](https://codeclimate.com/github/dapi/moysklad/badges/gpa.svg)](https://codeclimate.com/github/dapi/moysklad)
6
6
 
7
7
  * http://www.rubydoc.info/gems/moysklad
8
8
 
@@ -12,8 +12,9 @@
12
12
  * Все используемые сущности описаны и структурированы. Например [Good](lib/moysklad/entities/good.rb)
13
13
  * Любые действия с ресурсами (Create, Read, Update, Delete, List).
14
14
  * Виртуальные действия с ресурсами (`where`, `findWhere`)
15
+ * Автоматическая подгрузка списка если все данные не уместились в один запрос (метод `all`)
15
16
  * _Кеширование и предзагрузка_ ресурса со всеми записями (используем ресурс как локальную базу)
16
- * Работа с нескольмими аккаунтами на склада одновременно (отсуствие глобальных переменных).
17
+ * Работа с нескольмими аккаунтами склада одновременно (отсуствие глобальных переменных).
17
18
  * Удобная работа с подресурсами (например справочником свойств товара)
18
19
  * _Ассоциации_ между сущностями автоматически получают данные по API (`good.features`).
19
20
  * [Client](lib/moysklad/client.rb) для прямого обращения к API в случае крайней необходимости.
@@ -282,10 +283,20 @@ dictionary.entities(universe)
282
283
 
283
284
  > MS_LOGON=логин MS_PASSWORD=пароль ./script/rest.sh Country list > ./spec/fixtures/Country_list.raw
284
285
 
286
+ Если получаете 429 ошибку (too many requests) - лимит обращений по API от одного
287
+ аккаунта - 5 или 10 запросов в секунду (в секунду, Карл). Если не превышать его,
288
+ все будет хорошо - минутных или часовых лимитов нет.
289
+
285
290
  ## Ссылочки
286
291
 
287
292
  * Картапамяти по API http://www.mindmeister.com/246618635/online-moysklad-ru
288
293
  * Документация для разработчииков https://support.moysklad.ru/hc/ru/sections/200561443-Разработчикам
294
+ * Неплохая схема API в json https://gist.github.com/dapi/22a0790db19a4ff51a37
295
+
296
+ ## Другие биллиотеки
297
+
298
+ * PHP https://github.com/Tooyz/moysklad
299
+ * JavaScript/nodejs https://github.com/wmakeev/moysklad-client
289
300
 
290
301
  ## Присылайте пул-реквесты )
291
302
 
@@ -1,4 +1,4 @@
1
- require 'happymapper'
1
+ require 'virtus'
2
2
  require 'active_support'
3
3
  require "moysklad/version"
4
4
 
@@ -8,7 +8,8 @@ module Moysklad
8
8
  mattr_accessor :custom_logger
9
9
  extend ActiveSupport::Autoload
10
10
 
11
- autoload :Entities
11
+ require_relative 'moysklad/entities'
12
+ autoload :Error
12
13
  autoload :Resources
13
14
  autoload :Client
14
15
  autoload :Universe
@@ -4,31 +4,55 @@ require_relative 'client/errors'
4
4
 
5
5
  class Moysklad::Client
6
6
 
7
- URL = 'https://online.moysklad.ru'
7
+ # URL = 'https://online.moysklad.ru'
8
+ URL ='https://online.moysklad.ru/api/remap/1.1/'
8
9
 
9
10
  def initialize login: nil, password: nil
10
11
  @client = Faraday.new URL
11
12
  @client.basic_auth login, password
12
13
  end
13
14
 
15
+ def download(path, filename)
16
+ response = client.get path
17
+ File.open(filename, 'wb') { |fp| fp.write(response.body) }
18
+ end
19
+
14
20
  def get path, params={}
15
21
  logger.debug "Client: GET #{path} #{params}"
16
- validate client.get path, params
22
+ parse_response client.get path, params
23
+ end
24
+
25
+ def post path, data
26
+ logger.debug "Client: POST #{path}"
27
+ result = client.post do |req|
28
+ req.url path
29
+ req.headers['Content-Type'] = 'application/json'
30
+ req.headers['Accept'] = '*/*'
31
+ puts data
32
+ req.body = data
33
+ end
34
+ parse_response result
17
35
  end
18
36
 
19
37
  def put path, data
20
38
  logger.debug "Client: PUT #{path}"
21
39
  result = client.put do |req|
22
40
  req.url path
23
- req.headers['Content-Type'] = 'application/xml'
41
+ req.headers['Content-Type'] = 'application/json'
24
42
  req.headers['Accept'] = '*/*'
25
43
  req.body = data
26
44
  end
27
- validate result
45
+ parse_response result
28
46
  end
29
47
 
30
48
  def delete path
31
- validate client.delete path
49
+ logger.debug "Client: DELETE #{path}"
50
+ result = client.delete do |req|
51
+ req.url path
52
+ req.headers['Content-Type'] = 'application/json'
53
+ req.headers['Accept'] = '*/*'
54
+ end
55
+ parse_response result
32
56
  end
33
57
 
34
58
  private
@@ -39,10 +63,13 @@ class Moysklad::Client
39
63
  Moysklad.logger
40
64
  end
41
65
 
42
- def validate res
43
- return res.body if res.status == 200
44
-
45
- Moysklad::Client::Errors.build res
66
+ def parse_response res
67
+ if res.status == 200
68
+ Moysklad.logger.info "Response: #{res.body}"
69
+ return if res.body.blank?
70
+ JSON.parse res.body
71
+ else
72
+ Moysklad::Client::Errors.build res
73
+ end
46
74
  end
47
-
48
75
  end
@@ -1,23 +1,44 @@
1
1
  class Moysklad::Client
2
2
  class Errors
3
3
  def self.build res
4
- Moysklad.logger.warn "Moyskad::Client: #{res.status}: #{res.env.url.to_s}\n#{res.body}"
4
+ body = res.body.force_encoding('utf-8')
5
+ content_type = res.headers['content-type']
6
+
7
+ if content_type.start_with? 'application/json'
8
+ # ok
9
+ elsif content_type.start_with? 'text/html'
10
+ raise HtmlParsedError, body
11
+ else
12
+ raise UnknownError, body
13
+ end
14
+
15
+ # Encoding::UndefinedConversionError
16
+ # "\xD0" from ASCII-8BIT to UTF-8
17
+ begin
18
+ body = JSON.parse body
19
+ Moysklad.logger.debug "Moysklad::Client: #{res.status}: #{res.headers}, #{res.env.url.to_s}\n#{body}"
20
+ rescue Encoding::UndefinedConversionError => err
21
+ Moysklad.logger.error "#{err}"
22
+ rescue JSON::ParserError => err
23
+ Moysklad.logger.error "#{err}: #{res.headers}, body:#{body}"
24
+ raise ParsingError, body
25
+ end
5
26
 
6
27
  case res.status
7
- when 401
8
- raise UnauthorizedError.new res
28
+ when 401
29
+ raise UnauthorizedError.new body
9
30
  when 403
10
- raise ResourceForbidden.new res
11
- when 404
12
- raise NoResourceFound.new res.body
13
- when 405
14
- raise MethodNotAllowedError.new res
31
+ raise ResourceForbidden.new body
32
+ when 404
33
+ raise NoResourceFound.new body
34
+ when 405, 412
35
+ raise MethodNotAllowedError.new body
15
36
  when 500
16
- raise InternalServerError.new res
37
+ raise InternalServerError.new body
17
38
  when 502
18
- raise BadGatewayError.new res
19
- else
20
- raise ParsedError.new res
39
+ raise BadGatewayError.new body
40
+ else
41
+ raise JsonParsedError.new body
21
42
  end
22
43
  end
23
44
  end
@@ -32,39 +53,48 @@ class Moysklad::Client
32
53
  end
33
54
 
34
55
  def to_s
35
- message
56
+ message.to_s.encode('utf-8')
57
+ # <?xml version="1.0" encoding="UTF-8"?> <error> <uid>kiiiosk@wannabemoscow</uid> <moment>20150609112728449</moment> <message>������������ ���� ���������� �������� ������������.</message> </error>
58
+ rescue Encoding::CompatibilityError
59
+ message.to_s.force_encoding('cp1251').encode('utf-8')
36
60
  end
37
61
  end
62
+ class ParsingError < Error; end
63
+
64
+ class UnknownError < Error; end
38
65
 
39
66
  class NoResourceFound < Error; end
40
67
 
68
+ class JsonParsedError < Error
69
+ def initialize result
70
+ super result.to_json
71
+ end
72
+
73
+ attr_reader :error
74
+ end
75
+
41
76
  class HtmlParsedError < Error
42
- def initialize res
43
- @result = res
44
- @message = "[#{res.status}] #{parse_title res.body}"
77
+ def initialize body
78
+ @message = parse_title body
45
79
  end
46
80
 
47
81
  private
48
82
 
49
83
  def parse_title body
50
- doc = Nokogiri::HTML body
51
- # у ResourceForbidden есть <u>
52
- # у wrong_password <u> несколько
53
- # Можно ошибку разбирать более грамотно по свойствам type, message, description: http://i.gyazo.com/e9d5d08bd610882d87f39d9002cdf25a.png
54
- [doc.css('body').css('h1').text,doc.css('body').css('u').to_a.map(&:text).compact.last].join('; ')
84
+ Nokogiri::HTML(body).css('body').text
55
85
  rescue => err
56
- Moysklad.logger.debug "Moyskad::Client parse error #{err}: #{body}"
86
+ Moysklad.logger.debug "Moysklad::Client parse error #{err}: #{body}"
57
87
  body.force_encoding('utf-8')
58
88
  end
59
89
  end
60
90
 
61
- class MethodNotAllowedError < HtmlParsedError
91
+ class MethodNotAllowedError < JsonParsedError
62
92
  end
63
93
 
64
- class UnauthorizedError < HtmlParsedError
94
+ class UnauthorizedError < JsonParsedError
65
95
  end
66
96
 
67
- class ResourceForbidden < HtmlParsedError
97
+ class ResourceForbidden < JsonParsedError
68
98
  end
69
99
 
70
100
  class ParsedError < Error
@@ -72,24 +102,24 @@ class Moysklad::Client
72
102
  @status = result.status
73
103
  @result = result
74
104
  case result.headers['content-type']
75
-
105
+
76
106
  when /application\/xml/
77
107
  @error = Moysklad::Entities::Error.parse result.body
78
108
  @message = @error.message
79
109
  when /text\/html/
80
- doc = Nokogiri::HTML body
110
+ doc = Nokogiri::HTML result.body
81
111
  @message = doc.css('body').css('h1').text
82
112
  else
83
113
  raise "Unknown content-type #{result.headers['content-type']} to parse error #{result.body}"
84
114
  end
85
115
  rescue => err
86
- @message = "error in init #{err}: #{result.body}"
116
+ @message = "error in init #{err}: #{result}"
87
117
  end
88
118
 
89
119
  attr_reader :error
90
120
  end
91
121
 
92
122
 
93
- class BadGatewayError < HtmlParsedError; end
94
- class InternalServerError < ParsedError; end
123
+ class BadGatewayError < JsonParsedError; end
124
+ class InternalServerError < JsonParsedError; end
95
125
  end
@@ -1,46 +1,42 @@
1
1
  module Moysklad
2
2
  module Entities
3
3
  extend ActiveSupport::Autoload
4
-
5
- autoload :XmlFix
6
- autoload :CommonObject
7
- autoload :CompanyConcern
8
- autoload :Common
9
-
10
4
  %w{
11
- Slot
5
+ AttachmentDocument
12
6
  Uom
13
- Country
14
- Contact
15
- GoodFolder
16
- Good
7
+ Productfolder
8
+ Product
9
+ Bundle
17
10
  Barcode
18
- SalePrices
19
- SalePrice
20
11
  Error
21
- CustomerOrderPosition
22
12
  Consignment
23
13
  MyCompany
24
14
  Attribute
25
15
  GoodRef
26
16
  Base
17
+ Counterparty
18
+ Organization
27
19
  CustomerOrder
20
+ CustomerOrderPosition
28
21
  CustomEntity
29
- CustomEntityMetadata
30
- Feature
22
+ Variant
31
23
  AttributeMetadata
32
24
  EmbeddedEntityMetadata
25
+ CompanySettingsMetadata
33
26
  Price
34
- PriceType
35
- StockTO
27
+ Currency
36
28
  Company
37
- Warehouse
29
+ Store
30
+ Service
31
+ Owner
32
+ Group
38
33
  Collection
39
- CustomEntity
40
34
  Page
35
+ ResourceMetadata
36
+ Attribute
37
+ Characteristic
41
38
  }.each do |m|
42
39
  autoload m
43
40
  end
44
41
  end
45
-
46
42
  end
@@ -0,0 +1,6 @@
1
+ require_relative 'entity'
2
+
3
+ module Moysklad::Entities
4
+ class Assortment < Entity
5
+ end
6
+ end
@@ -0,0 +1,16 @@
1
+ module Moysklad::Entities
2
+ class AttachmentDocument < Base
3
+ include Moysklad::Entities::Common
4
+
5
+ tag 'file'
6
+
7
+ attribute :filename, String
8
+ attribute :miniatureUuid, String
9
+ attribute :name, String
10
+
11
+ #def self.parse node, options
12
+ ## TODO create AttachmentDocument
13
+ #''
14
+ #end
15
+ end
16
+ end
@@ -1,47 +1,124 @@
1
+ require_relative 'attribute_value'
2
+ require_relative 'meta'
3
+
4
+ # Атрибут товара (ссылка на его тип и его значение)
1
5
  module Moysklad::Entities
2
6
  class Attribute < Base
3
- include Moysklad::Entities::Common
7
+ attribute :meta, Meta
8
+ attribute :id, String
9
+ attribute :name, String
10
+ attribute :customEntityMeta, Meta
11
+ attribute :type, String #attributemetadata
12
+ attribute :value, AttributeValue
13
+ attribute :required, Boolean
4
14
 
5
- tag 'attribute'
15
+ def to_s
16
+ "#{name} (#{type}): #{value}"
17
+ end
6
18
 
7
- attribute :metadataUuid, String
8
- attribute :valueString, String
9
- attribute :valueText, String
19
+ def is_dictionary?
20
+ type == 'customentity'
21
+ end
10
22
 
11
- attribute :entityValueUuid, String
23
+ ### Если это свойство типа ID_CUSTOM, то возвращается пользовательский справочник
24
+ ###
25
+ ### @return Moysklad::Entities::CustomEntityMetadata
26
+ ##def dictionatyMetadata universe
27
+ ##raise "Это свойства не типа справочник" unless dictionaryMetadataUuid
28
+ ##universe.custom_entity_metadata.find dictionaryMetadataUuid
29
+ ##end
12
30
 
13
- # Объект описывающий тип атритуба
14
- #
15
- # @return Moysklad::Entities::AttributeMetadata
16
- #
17
- def metadata universe
18
- universe.embedded_entity_metadata.subresource_by_name(:GoodFolder).find metadataUuid
19
- end
31
+ ### Справочник к которому принадлежит это ссвойство
32
+ ###
33
+ ### @return Moysklad::Entities::EmbeddedEntityMetadata
34
+ ##def entityMetadata universe
35
+ ##universe.embedded_entity_metadata.find entityMetadataUuid
36
+ ##end
20
37
 
21
- # Название свойства, полученное из AttributeMetadata
22
- #
23
- # @return String
24
- #
25
- def attributeName universe
26
- metadata(universe).name
27
- end
28
38
 
29
- # Значение свойства согласно его типу
30
- #
31
- # @return [String | Moysklad::Entities::CustomEntity | Integer | Decimal ]
32
- def get_value universe
33
- md = metadata universe
34
- case md.attrType
35
- when 'ID_CUSTOM'
36
- universe.custom_entities.find( entityValueUuid ).name
37
- when 'TEXT'
38
- valueText
39
- when 'STRING'
40
- valueString
41
- # TODO Другие типы
42
- else
43
- raise "Не известный тип мета-аттрибута #{md.uuid}: #{md.attrType}"
44
- end
45
- end
39
+ ### Объект описывающий тип атритуба
40
+ ###
41
+ ### @return Moysklad::Entities::AttributeMetadata
42
+ ###
43
+ ##def metadata universe
44
+ ##universe.embedded_entity_metadata.subresource_by_name(:GoodFolder).find metadataUuid
45
+ ##end
46
+
47
+ ### Название свойства, полученное из AttributeMetadata
48
+ ###
49
+ ### @return String
50
+ ###
51
+ ##def attributeName universe
52
+ ##metadata(universe).name
53
+ ##end
54
+
55
+ ### Значение свойства согласно его типу
56
+ ###
57
+ ### @return [String | Moysklad::Entities::CustomEntity | Integer | Decimal ]
58
+ #def get_value universe
59
+ #md = metadata universe
60
+ #case md.attrType
61
+ #when 'ID_CUSTOM'
62
+ #universe.custom_entities.find( entityValueUuid ).name
63
+ #when 'LINK'
64
+ #valueText
65
+ #when 'TEXT'
66
+ #valueText
67
+ #when 'STRING'
68
+ #valueString
69
+ #when 'DOUBLE'
70
+ #doubleValue
71
+ #when 'LONG'
72
+ #longValue
73
+ #when 'TIME'
74
+ #timeValue
75
+ #when 'FILE'
76
+ #file
77
+ #else
78
+ #raise "Не известный тип мета-аттрибута #{md.uuid}: #{md.attrType}"
79
+ #end
80
+ #end
81
+ ### Объект описывающий тип атритуба
82
+ ###
83
+ ### @return Moysklad::Entities::AttributeMetadata
84
+ ###
85
+ ##def metadata universe
86
+ ##universe.embedded_entity_metadata.subresource_by_name(:GoodFolder).find metadataUuid
87
+ ##end
88
+
89
+ ### Название свойства, полученное из AttributeMetadata
90
+ ###
91
+ ### @return String
92
+ ###
93
+ ##def attributeName universe
94
+ ##metadata(universe).name
95
+ ##end
96
+
97
+ ### Значение свойства согласно его типу
98
+ ###
99
+ ### @return [String | Moysklad::Entities::CustomEntity | Integer | Decimal ]
100
+ ##def get_value universe
101
+ ##md = metadata universe
102
+ ##case md.attrType
103
+ ##when 'ID_CUSTOM'
104
+ ##universe.custom_entities.find( entityValueUuid ).name
105
+ ##when 'LINK'
106
+ ##valueText
107
+ ##when 'TEXT'
108
+ ##valueText
109
+ ##when 'STRING'
110
+ ##valueString
111
+ ##when 'DOUBLE'
112
+ ##doubleValue
113
+ ##when 'LONG'
114
+ ##longValue
115
+ ##when 'TIME'
116
+ ##timeValue
117
+ ##when 'FILE'
118
+ ##file
119
+ ##else
120
+ ##raise "Не известный тип мета-аттрибута #{md.uuid}: #{md.attrType}"
121
+ ##end
122
+ ##end
46
123
  end
47
124
  end