moysklad 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,13 @@
|
|
1
|
+
require_relative 'base'
|
2
|
+
require_relative 'attribute_metadata'
|
3
|
+
require_relative 'characteristic_metadata'
|
4
|
+
require_relative 'price_type'
|
5
|
+
|
6
|
+
module Moysklad::Entities
|
7
|
+
class ResourceMetadata < Base
|
8
|
+
attribute :meta, Meta
|
9
|
+
attribute :attrs, Array[AttributeMetadata]
|
10
|
+
attribute :characteristics, Array[CharacteristicMetadata]
|
11
|
+
attribute :priceTypes, Array[PriceType]
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative 'entity'
|
2
|
+
require_relative 'uom'
|
3
|
+
require_relative 'owner'
|
4
|
+
require_relative 'group'
|
5
|
+
require_relative 'price'
|
6
|
+
|
7
|
+
module Moysklad::Entities
|
8
|
+
class Service < Entity
|
9
|
+
attribute :accountId, String
|
10
|
+
attribute :owner, Owner
|
11
|
+
attribute :group, Group
|
12
|
+
attribute :vat, Float
|
13
|
+
attribute :effectiveVat, Float
|
14
|
+
attribute :pathName, String
|
15
|
+
attribute :productFolder, Productfolder
|
16
|
+
|
17
|
+
attribute :uom, Uom
|
18
|
+
|
19
|
+
attribute :minPrice, Float
|
20
|
+
attribute :salePrices, Array[Price]
|
21
|
+
|
22
|
+
# Когда загружаем через ассортименты эти поля устанавливаются
|
23
|
+
attribute :stock, Float
|
24
|
+
attribute :reserve, Float
|
25
|
+
attribute :inTransit, Float
|
26
|
+
attribute :quantity, Float
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require_relative 'characteristic'
|
2
|
+
require_relative 'shortcut'
|
3
|
+
require_relative 'entity'
|
4
|
+
|
5
|
+
module Moysklad::Entities
|
6
|
+
class Variant < Entity
|
7
|
+
|
8
|
+
attribute :accountId, String
|
9
|
+
|
10
|
+
attribute :characteristics, Array[Characteristic]
|
11
|
+
attribute :minPrice, Float
|
12
|
+
attribute :buyPrice, Float
|
13
|
+
attribute :salePrices, Array[Price]
|
14
|
+
attribute :product, Shortcut
|
15
|
+
attribute :things, Array[String]
|
16
|
+
|
17
|
+
# Когда загружаем через ассортименты эти поля устанавливаются
|
18
|
+
attribute :stock, Float
|
19
|
+
attribute :reserve, Float
|
20
|
+
attribute :inTransit, Float
|
21
|
+
attribute :quantity, Float
|
22
|
+
|
23
|
+
#characteristics - Характеристики Модификации Необходимое
|
24
|
+
#minPrice - Минимальная цена
|
25
|
+
#buyPrice - Закупочная цена
|
26
|
+
#salePrices - Цены продажи
|
27
|
+
#product - Метаданные, представляющие с собой ссылку на товар, к которому привязана Модификация. Необходимое
|
28
|
+
#things - Серийные номера Только для чтения
|
29
|
+
|
30
|
+
#attribute :charactideristics,
|
31
|
+
#attribute :minPrice
|
32
|
+
|
33
|
+
#tag 'feature'
|
34
|
+
|
35
|
+
#attribute :goodUuid, String
|
36
|
+
|
37
|
+
#attribute :archived, Boolean
|
38
|
+
#attribute :isDefault, Boolean
|
39
|
+
|
40
|
+
#element :shared, Boolean
|
41
|
+
|
42
|
+
#has_many :attributes, Moysklad::Entities::Attribute
|
43
|
+
#has_many :barcodes, Moysklad::Entities::Barcode
|
44
|
+
|
45
|
+
#def good universe
|
46
|
+
#cache :good, universe do
|
47
|
+
#universe.good.find goodUuid
|
48
|
+
#end
|
49
|
+
#end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Moysklad::Error = Class.new StandardError
|
data/lib/moysklad/resources.rb
CHANGED
@@ -10,15 +10,17 @@ module Moysklad::Resources
|
|
10
10
|
|
11
11
|
require_relative 'resources/base'
|
12
12
|
require_relative 'resources/indexed'
|
13
|
-
require_relative 'resources/
|
14
|
-
require_relative 'resources/
|
15
|
-
require_relative 'resources/embedded_entity_metadata_indexed'
|
16
|
-
require_relative 'resources/custom_entity_metadata'
|
17
|
-
require_relative 'resources/subresource'
|
13
|
+
require_relative 'resources/custom_entities'
|
14
|
+
require_relative 'resources/assortments'
|
18
15
|
|
19
16
|
# Простые ресурсы, которые создаются автоматически
|
20
|
-
%w{
|
17
|
+
%w{Products Productfolders Uoms PriceType Countries Variants
|
18
|
+
Counterparty
|
19
|
+
Organization
|
20
|
+
CustomerOrders Store
|
21
|
+
Currency
|
22
|
+
Workflows
|
23
|
+
Companies Consignments MyCompanies}.each do |klass_name|
|
21
24
|
const_set klass_name, Class.new( Base )
|
22
25
|
end
|
23
|
-
|
24
26
|
end
|
@@ -1,7 +1,8 @@
|
|
1
|
+
require 'json'
|
1
2
|
class Moysklad::Resources::Base
|
2
|
-
PREFIX_PATH = '
|
3
|
+
PREFIX_PATH = 'entity/'
|
3
4
|
|
4
|
-
def self.inherited superclass
|
5
|
+
def self.inherited superclass
|
5
6
|
super
|
6
7
|
Moysklad::Resources.register_resource superclass
|
7
8
|
end
|
@@ -14,30 +15,28 @@ class Moysklad::Resources::Base
|
|
14
15
|
end
|
15
16
|
|
16
17
|
# https://support.moysklad.ru/hc/ru/articles/203404253-REST-сервис-синхронизации-данных
|
17
|
-
def initialize client: nil
|
18
|
+
def initialize client: nil, list_path: nil
|
19
|
+
@list_path = list_path
|
18
20
|
raise "Должен быть Moysklad::Client" unless client.is_a? Moysklad::Client
|
19
21
|
@client = client
|
20
22
|
end
|
21
23
|
|
24
|
+
def metadata
|
25
|
+
Moysklad::Entities::ResourceMetadata.build client.get(metadata_path), self
|
26
|
+
end
|
27
|
+
|
22
28
|
# Возвращает список элементов как есть
|
23
29
|
#
|
24
30
|
# @return [Array of Moysklad::Entities::Base]
|
25
31
|
def list params={}
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
# Возвращает страницу со списком элементов
|
30
|
-
#
|
31
|
-
# @return [Moysklad::Entities::Page]
|
32
|
-
def page params={}
|
33
|
-
parse_page client.get list_path, params
|
32
|
+
load_collection client.get list_path, params
|
34
33
|
end
|
35
34
|
|
36
35
|
# Забираем элемент по uuid
|
37
36
|
#
|
38
37
|
# @return [Moysklad::Entities::Base]
|
39
|
-
def get uuid
|
40
|
-
|
38
|
+
def get uuid, params = {}
|
39
|
+
parse_get client.get item_path(uuid), params
|
41
40
|
end
|
42
41
|
|
43
42
|
# Модифицируем элемент по uuid
|
@@ -56,14 +55,14 @@ class Moysklad::Resources::Base
|
|
56
55
|
# @return [Moysklad::Entities::Base]
|
57
56
|
def create model
|
58
57
|
raise "Должна быть модель типа Moysklad::Entities::Base" unless model.is_a? Moysklad::Entities::Base
|
59
|
-
|
58
|
+
parse_get client.post create_path, model.to_json
|
60
59
|
end
|
61
60
|
|
62
61
|
# Удаляем запись по uuid
|
63
62
|
#
|
64
63
|
# @param uuid
|
65
64
|
def delete uuid
|
66
|
-
client.delete item_path uuid
|
65
|
+
client.delete item_path uuid
|
67
66
|
end
|
68
67
|
|
69
68
|
def self.type
|
@@ -74,38 +73,16 @@ class Moysklad::Resources::Base
|
|
74
73
|
ActiveSupport::Inflector.underscore ActiveSupport::Inflector.pluralize type
|
75
74
|
end
|
76
75
|
|
77
|
-
def self.entity_class
|
78
|
-
ActiveSupport::Inflector.constantize "Moysklad::Entities::#{type.to_s}"
|
79
|
-
end
|
80
|
-
|
81
76
|
private
|
82
77
|
|
83
78
|
attr_reader :client
|
84
79
|
|
85
|
-
def
|
86
|
-
|
87
|
-
resource.to_xml.to_s
|
88
|
-
else
|
89
|
-
resource.to_s
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
def parse content
|
94
|
-
self.class.entity_class.parse parse_content content
|
95
|
-
end
|
96
|
-
|
97
|
-
def parse_content content
|
98
|
-
Nokogiri::XML content
|
80
|
+
def parse_get data
|
81
|
+
entity_class.build data, self
|
99
82
|
end
|
100
83
|
|
101
|
-
def
|
102
|
-
|
103
|
-
|
104
|
-
# TODO Парсится два раза. Оптимизировать. Например сделать динамические CollectionFeature
|
105
|
-
# и парсить через них
|
106
|
-
|
107
|
-
items = parse content
|
108
|
-
Moysklad::Entities::Page.new items, col.total, col.start, col.count
|
84
|
+
def load_collection data
|
85
|
+
collection_class.build data, self
|
109
86
|
end
|
110
87
|
|
111
88
|
def item_path uuid
|
@@ -117,11 +94,22 @@ class Moysklad::Resources::Base
|
|
117
94
|
end
|
118
95
|
|
119
96
|
def list_path
|
120
|
-
|
97
|
+
@list_path ||= prefix_path
|
121
98
|
end
|
122
99
|
|
123
|
-
def
|
124
|
-
|
100
|
+
def metadata_path
|
101
|
+
prefix_path + '/metadata'
|
102
|
+
end
|
103
|
+
|
104
|
+
def collection_class
|
105
|
+
Moysklad::Entities::Collection
|
106
|
+
end
|
107
|
+
|
108
|
+
def entity_class
|
109
|
+
ActiveSupport::Inflector.constantize "Moysklad::Entities::#{self.class.type.to_s}"
|
125
110
|
end
|
126
111
|
|
112
|
+
def prefix_path
|
113
|
+
PREFIX_PATH + self.class.type.downcase
|
114
|
+
end
|
127
115
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Moysklad::Resources
|
2
|
+
# Элементы словаря
|
3
|
+
class CustomEntities < Base
|
4
|
+
# custom_entity_meta_id - id словаря, элементы которого хотим получить
|
5
|
+
def initialize custom_entity_meta_id: nil, client:, list_path: nil
|
6
|
+
@custom_entity_meta_id = custom_entity_meta_id
|
7
|
+
super client: client, list_path: list_path
|
8
|
+
end
|
9
|
+
|
10
|
+
# Публичный чтобы был доступен из индекса
|
11
|
+
def cache_key
|
12
|
+
[list_path, custom_entity_meta_id].join(':')
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
attr_reader :custom_entity_meta_id
|
18
|
+
|
19
|
+
def item_path
|
20
|
+
raise
|
21
|
+
end
|
22
|
+
|
23
|
+
def list_path
|
24
|
+
@list_path || (prefix_path + '/' + custom_entity_meta_id.to_s)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,18 +1,22 @@
|
|
1
1
|
module Moysklad::Resources
|
2
|
-
# https://online.moysklad.ru/exchange/rest/ms/xml/CustomEntityMetadata/list
|
3
2
|
# Список аттрибутов, которые используются как свойства товара
|
3
|
+
# https://online.moysklad.ru/api/remap/1.1/entity/companysettings/metadata/
|
4
|
+
# https://online.moysklad.ru/api/remap/1.1/entity/variant/metadata/
|
5
|
+
# https://online.moysklad.ru/api/remap/1.1/entity/product/metadata/
|
4
6
|
class CustomEntityMetadata < Base
|
5
|
-
def self.entity_class
|
6
|
-
Moysklad::Entities::CustomEntityMetadata
|
7
|
-
end
|
8
7
|
|
9
|
-
def
|
10
|
-
|
8
|
+
def list
|
9
|
+
raise
|
11
10
|
end
|
12
11
|
|
13
|
-
|
14
|
-
|
12
|
+
private
|
13
|
+
|
14
|
+
def prefix_path
|
15
|
+
'entity/companysettings/metadata/customEntities/'
|
15
16
|
end
|
16
17
|
|
18
|
+
def list_path
|
19
|
+
raise 'Список напрямую получить не возможно'
|
20
|
+
end
|
17
21
|
end
|
18
22
|
end
|
@@ -1,30 +1,39 @@
|
|
1
1
|
require_relative 'where_filter'
|
2
|
+
require_relative 'load_all'
|
3
|
+
require_relative 'indexed_cache'
|
2
4
|
|
3
5
|
module Moysklad::Resources
|
4
6
|
class Indexed < SimpleDelegator
|
7
|
+
WrongEntriesCountError = Class.new StandardError
|
8
|
+
NoIdInEntity = Class.new StandardError
|
9
|
+
|
5
10
|
include WhereFilter
|
11
|
+
include LoadAll
|
12
|
+
include IndexedCache
|
6
13
|
|
7
14
|
def initialize resource
|
8
|
-
raise 'resource должен быть Moysklad::Resources::Base' unless resource.is_a? Moysklad::Resources::Base
|
15
|
+
raise TypeError, 'resource должен быть Moysklad::Resources::Base' unless resource.is_a? Moysklad::Resources::Base
|
9
16
|
super resource
|
10
17
|
end
|
11
18
|
|
12
19
|
# Автоматически подгружает постранично данныез из API и возвращает их все сразу.
|
13
20
|
#
|
14
21
|
# @return [Array of Moysklad::Entities::Base]
|
15
|
-
def all
|
16
|
-
|
22
|
+
def all(params = {})
|
23
|
+
cache_fetch do
|
24
|
+
pull_list(params)
|
25
|
+
end
|
17
26
|
end
|
18
27
|
|
19
28
|
# Возвращает запрашивемую запись из кеша.
|
20
29
|
# Предварительно подгружает все записи через метод `all`
|
21
30
|
#
|
22
31
|
# @return Moyskald::Entities::Base
|
23
|
-
def find
|
24
|
-
index[
|
32
|
+
def find id
|
33
|
+
index[id]
|
25
34
|
end
|
26
35
|
|
27
|
-
# Перечень
|
36
|
+
# Перечень id-ов всех элементов в ресуресе
|
28
37
|
#
|
29
38
|
# @return [Array of uuids]
|
30
39
|
def uuids
|
@@ -45,42 +54,21 @@ module Moysklad::Resources
|
|
45
54
|
end
|
46
55
|
|
47
56
|
def index
|
48
|
-
pull_list unless
|
49
|
-
|
57
|
+
pull_list unless cached_index
|
58
|
+
cached_index
|
50
59
|
end
|
51
60
|
|
52
|
-
def pull_list
|
53
|
-
|
54
|
-
@_index = prepare_index @cached_list
|
55
|
-
@cached_list
|
61
|
+
def pull_list(params)
|
62
|
+
load_all(params)
|
56
63
|
end
|
57
64
|
|
58
|
-
def
|
59
|
-
start = 0
|
60
|
-
list = []
|
61
|
-
|
62
|
-
_page = nil
|
63
|
-
|
64
|
-
begin
|
65
|
-
_page = page start: start
|
66
|
-
list += _page.items
|
67
|
-
break if _page.items.empty?
|
68
|
-
start = list.count
|
69
|
-
end while start<_page.total
|
70
|
-
|
71
|
-
raise "При загрузке коллекции в результате колиество не совпадает с total: #{list.count}<>#{_page.total}" unless list.count==_page.total
|
72
|
-
|
73
|
-
list
|
74
|
-
end
|
75
|
-
|
76
|
-
def prepare_index cached_list
|
65
|
+
def prepare_index list
|
77
66
|
i={}
|
78
|
-
|
79
|
-
raise "У объекта нет
|
80
|
-
i[r.
|
67
|
+
list.each do |r|
|
68
|
+
raise NoIdInEntity, "У объекта нет id: #{r}" unless r.respond_to?(:id) && r.id
|
69
|
+
i[r.id]=r
|
81
70
|
end
|
82
71
|
return i
|
83
72
|
end
|
84
|
-
|
85
73
|
end
|
86
74
|
end
|