moysklad 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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