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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +1 -0
- data/README.md +14 -3
- data/lib/moysklad.rb +3 -2
- data/lib/moysklad/client.rb +37 -10
- data/lib/moysklad/client/errors.rb +60 -30
- data/lib/moysklad/entities.rb +17 -21
- data/lib/moysklad/entities/assortment.rb +6 -0
- data/lib/moysklad/entities/attachment_document.rb +16 -0
- data/lib/moysklad/entities/attribute.rb +114 -37
- data/lib/moysklad/entities/attribute_metadata.rb +9 -31
- data/lib/moysklad/entities/attribute_value.rb +19 -0
- data/lib/moysklad/entities/barcode.rb +10 -4
- data/lib/moysklad/entities/base.rb +23 -8
- data/lib/moysklad/entities/bundle.rb +39 -0
- data/lib/moysklad/entities/characteristic.rb +6 -0
- data/lib/moysklad/entities/characteristic_metadata.rb +6 -0
- data/lib/moysklad/entities/collection.rb +30 -7
- data/lib/moysklad/entities/collection_meta.rb +11 -0
- data/lib/moysklad/entities/common_object.rb +0 -2
- data/lib/moysklad/entities/company_settings_metadata.rb +28 -0
- data/lib/moysklad/entities/consignment.rb +19 -17
- data/lib/moysklad/entities/context.rb +9 -0
- data/lib/moysklad/entities/counterparty.rb +18 -0
- data/lib/moysklad/entities/currency.rb +29 -0
- data/lib/moysklad/entities/custom_entity.rb +20 -10
- data/lib/moysklad/entities/custom_entity_metadata.rb +7 -32
- data/lib/moysklad/entities/customer_order.rb +116 -23
- data/lib/moysklad/entities/customer_order_position.rb +10 -18
- data/lib/moysklad/entities/employee.rb +7 -0
- data/lib/moysklad/entities/entity.rb +42 -0
- data/lib/moysklad/entities/good_folder.rb +1 -0
- data/lib/moysklad/entities/group.rb +7 -0
- data/lib/moysklad/entities/image.rb +17 -0
- data/lib/moysklad/entities/images.rb +10 -0
- data/lib/moysklad/entities/meta.rb +14 -0
- data/lib/moysklad/entities/organization.rb +19 -0
- data/lib/moysklad/entities/owner.rb +4 -0
- data/lib/moysklad/entities/price.rb +5 -8
- data/lib/moysklad/entities/price_type.rb +2 -8
- data/lib/moysklad/entities/product.rb +54 -0
- data/lib/moysklad/entities/productfolder.rb +13 -0
- data/lib/moysklad/entities/rate.rb +9 -0
- data/lib/moysklad/entities/resource_metadata.rb +13 -0
- data/lib/moysklad/entities/service.rb +28 -0
- data/lib/moysklad/entities/shortcut.rb +11 -0
- data/lib/moysklad/entities/store.rb +10 -0
- data/lib/moysklad/entities/time.rb +13 -0
- data/lib/moysklad/entities/uom.rb +7 -0
- data/lib/moysklad/entities/variant.rb +51 -0
- data/lib/moysklad/entities/workflow.rb +11 -0
- data/lib/moysklad/entities/workflow_state.rb +8 -0
- data/lib/moysklad/error.rb +1 -0
- data/lib/moysklad/resources.rb +9 -7
- data/lib/moysklad/resources/assortments.rb +14 -0
- data/lib/moysklad/resources/base.rb +32 -44
- data/lib/moysklad/resources/custom_entities.rb +27 -0
- data/lib/moysklad/resources/custom_entity_metadata.rb +12 -8
- data/lib/moysklad/resources/embedded_entity_metadata.rb +0 -1
- data/lib/moysklad/resources/indexed.rb +23 -35
- data/lib/moysklad/resources/indexed_cache.rb +36 -0
- data/lib/moysklad/resources/load_all.rb +21 -0
- data/lib/moysklad/resources/products.rb +10 -0
- data/lib/moysklad/resources/where_filter.rb +0 -1
- data/lib/moysklad/universe.rb +16 -2
- data/lib/moysklad/version.rb +1 -1
- data/moysklad.gemspec +3 -1
- data/scripts/rest.sh +5 -2
- data/spec/fixtures/Good_WithManyAttributes.raw +13 -0
- data/spec/fixtures/Workflow_list.raw +15 -0
- data/spec/fixtures/good_with_image.xml +39 -0
- data/spec/lib/moysklad/entities/customer_order_spec.rb +7 -2
- data/spec/lib/moysklad/entities/good_spec.rb +9 -0
- data/spec/lib/moysklad/resources/workflows_spec.rb +21 -0
- data/spec/spec_helper.rb +2 -1
- data/test.rb +177 -0
- metadata +97 -44
- data/lib/moysklad/entities/common.rb +0 -15
- data/lib/moysklad/entities/feature.rb +0 -20
- data/lib/moysklad/entities/good.rb +0 -34
- data/lib/moysklad/entities/stock_to.rb +0 -33
- data/lib/moysklad/entities/warehouse.rb +0 -15
- data/lib/moysklad/entities/xml_fix.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0434de2e989bb1cb0ca34205101ee8c0e978540b
|
4
|
+
data.tar.gz: ccd6cc1de782b6baf31c331b7e20fe9d7a5c5698
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9beac30a1c510af7d1aff68e5a24ede6d24ec6cf86fdee7486e0e6826c5410a9b0212523ea649076f6575935af3c7ad751c01c58f78e086a54f77cdc9bd9970b
|
7
|
+
data.tar.gz: cf62d29570bae5e6f4dfae85ee1ca4f283a55a95e28a7b898c1f2bb768d530a011aaae5f72b5ec9a9880b66d310f197788861e62e08ce835e2f9276c3276090c
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# Ruby-клиент для REST XML API Moysklad
|
2
2
|
|
3
|
-
[](https://travis-ci.org/
|
3
|
+
[](https://travis-ci.org/dapi/moysklad)
|
4
4
|
[](https://www.versioneye.com/user/projects/548225818674a4b5b90004dd)
|
5
|
-
[](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
|
|
data/lib/moysklad.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
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
|
-
|
11
|
+
require_relative 'moysklad/entities'
|
12
|
+
autoload :Error
|
12
13
|
autoload :Resources
|
13
14
|
autoload :Client
|
14
15
|
autoload :Universe
|
data/lib/moysklad/client.rb
CHANGED
@@ -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
|
-
|
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/
|
41
|
+
req.headers['Content-Type'] = 'application/json'
|
24
42
|
req.headers['Accept'] = '*/*'
|
25
43
|
req.body = data
|
26
44
|
end
|
27
|
-
|
45
|
+
parse_response result
|
28
46
|
end
|
29
47
|
|
30
48
|
def delete path
|
31
|
-
|
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
|
43
|
-
|
44
|
-
|
45
|
-
|
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
|
-
|
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
|
28
|
+
when 401
|
29
|
+
raise UnauthorizedError.new body
|
9
30
|
when 403
|
10
|
-
raise ResourceForbidden.new
|
11
|
-
when 404
|
12
|
-
raise NoResourceFound.new
|
13
|
-
when 405
|
14
|
-
raise MethodNotAllowedError.new
|
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
|
37
|
+
raise InternalServerError.new body
|
17
38
|
when 502
|
18
|
-
raise BadGatewayError.new
|
19
|
-
else
|
20
|
-
raise
|
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
|
43
|
-
@
|
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
|
-
|
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 "
|
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 <
|
91
|
+
class MethodNotAllowedError < JsonParsedError
|
62
92
|
end
|
63
93
|
|
64
|
-
class UnauthorizedError <
|
94
|
+
class UnauthorizedError < JsonParsedError
|
65
95
|
end
|
66
96
|
|
67
|
-
class ResourceForbidden <
|
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
|
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 <
|
94
|
-
class InternalServerError <
|
123
|
+
class BadGatewayError < JsonParsedError; end
|
124
|
+
class InternalServerError < JsonParsedError; end
|
95
125
|
end
|
data/lib/moysklad/entities.rb
CHANGED
@@ -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
|
-
|
5
|
+
AttachmentDocument
|
12
6
|
Uom
|
13
|
-
|
14
|
-
|
15
|
-
|
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
|
-
|
30
|
-
Feature
|
22
|
+
Variant
|
31
23
|
AttributeMetadata
|
32
24
|
EmbeddedEntityMetadata
|
25
|
+
CompanySettingsMetadata
|
33
26
|
Price
|
34
|
-
|
35
|
-
StockTO
|
27
|
+
Currency
|
36
28
|
Company
|
37
|
-
|
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,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
|
-
|
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
|
-
|
15
|
+
def to_s
|
16
|
+
"#{name} (#{type}): #{value}"
|
17
|
+
end
|
6
18
|
|
7
|
-
|
8
|
-
|
9
|
-
|
19
|
+
def is_dictionary?
|
20
|
+
type == 'customentity'
|
21
|
+
end
|
10
22
|
|
11
|
-
|
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
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
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
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
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
|