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,36 @@
|
|
1
|
+
module IndexedCache
|
2
|
+
def cache!
|
3
|
+
all.count
|
4
|
+
end
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def cache_fetch
|
9
|
+
return cache[:list] if cache[:list]
|
10
|
+
cache[:list] = yield
|
11
|
+
cache[:index] = prepare_index cache[:list]
|
12
|
+
|
13
|
+
cache[:list]
|
14
|
+
end
|
15
|
+
|
16
|
+
def cache
|
17
|
+
@cache ||= {}
|
18
|
+
@cache[cache_key] ||= { index: nil, list: nil}
|
19
|
+
end
|
20
|
+
|
21
|
+
def cached_index
|
22
|
+
cache[:index]
|
23
|
+
end
|
24
|
+
|
25
|
+
def cache_index(index)
|
26
|
+
cache[:index] = index
|
27
|
+
end
|
28
|
+
|
29
|
+
def cache_key
|
30
|
+
if __getobj__.respond_to? :cache_key
|
31
|
+
__getobj__.send :cache_key
|
32
|
+
else
|
33
|
+
:default
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Moysklad::Resources
|
2
|
+
module LoadAll
|
3
|
+
def load_all(params = {})
|
4
|
+
limit = 100
|
5
|
+
offset = 0
|
6
|
+
rows = []
|
7
|
+
collection = nil
|
8
|
+
|
9
|
+
begin
|
10
|
+
collection = list params.merge(limit: limit, offset: offset)
|
11
|
+
rows += collection.rows
|
12
|
+
break if collection.rows.empty?
|
13
|
+
offset = rows.count
|
14
|
+
end while offset<collection.meta.size
|
15
|
+
|
16
|
+
raise WrongEntriesCountError, "При загрузке коллекции в результате колиество не совпадает с total: #{rows.count}<>#{collection.meta.size}" unless rows.count==collection.meta.size
|
17
|
+
|
18
|
+
rows
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/moysklad/universe.rb
CHANGED
@@ -14,6 +14,20 @@ module Moysklad
|
|
14
14
|
Client
|
15
15
|
end
|
16
16
|
|
17
|
+
def company_settings_metadata
|
18
|
+
Moysklad::Entities::CompanySettingsMetadata.build client.get('entity/companysettings/metadata'), self
|
19
|
+
end
|
20
|
+
|
21
|
+
# Все элементы всех словарей
|
22
|
+
def all_custom_entities
|
23
|
+
list = []
|
24
|
+
dictionaries = company_settings_metadata.customEntities
|
25
|
+
dictionaries.each do |d|
|
26
|
+
list += d.entities(self)
|
27
|
+
end
|
28
|
+
list
|
29
|
+
end
|
30
|
+
|
17
31
|
# Ленивое создание universe
|
18
32
|
#
|
19
33
|
# @param login
|
@@ -25,8 +39,8 @@ module Moysklad
|
|
25
39
|
@@resources_list = []
|
26
40
|
Moysklad::Resources.resources.each do |resource_klass|
|
27
41
|
@@resources_list << resource_klass.pluralized_type.to_sym
|
28
|
-
define_method resource_klass.pluralized_type do
|
29
|
-
@resources[resource_klass.type] ||= resource_klass.indexed( client: client )
|
42
|
+
define_method resource_klass.pluralized_type do |opts={}|
|
43
|
+
@resources[resource_klass.type] ||= resource_klass.indexed( opts.merge client: client )
|
30
44
|
end
|
31
45
|
end
|
32
46
|
|
data/lib/moysklad/version.rb
CHANGED
data/moysklad.gemspec
CHANGED
@@ -21,7 +21,8 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.required_ruby_version = '>= 2.0.0'
|
22
22
|
|
23
23
|
spec.add_runtime_dependency 'faraday'
|
24
|
-
spec.add_runtime_dependency '
|
24
|
+
spec.add_runtime_dependency 'virtus'
|
25
|
+
# spec.add_runtime_dependency 'nokogiri-happymapper'
|
25
26
|
spec.add_runtime_dependency 'activesupport', '>=3.0.0'
|
26
27
|
|
27
28
|
spec.add_development_dependency "bundler", "~> 1.6"
|
@@ -35,4 +36,5 @@ Gem::Specification.new do |spec|
|
|
35
36
|
spec.add_development_dependency "guard-rspec"
|
36
37
|
spec.add_development_dependency 'guard-ctags-bundler'
|
37
38
|
spec.add_development_dependency 'yard'
|
39
|
+
spec.add_development_dependency 'minitest', '~> 5.1'
|
38
40
|
end
|
data/scripts/rest.sh
CHANGED
@@ -11,16 +11,19 @@ fi
|
|
11
11
|
|
12
12
|
if [ -z "$resource" ]; then
|
13
13
|
echo "Запуск: rest.sh Resoruce [action]"
|
14
|
-
echo "Например: rest.sh
|
14
|
+
echo "Например: rest.sh entity product"
|
15
15
|
exit 2
|
16
16
|
fi
|
17
17
|
|
18
|
-
|
18
|
+
# url_v1.0="https://online.moysklad.ru/exchange/rest/ms/xml/$1/$2"
|
19
|
+
# url="https://online.moysklad.ru/api/remap/1.1/"
|
20
|
+
url="https://online.moysklad.ru/api/remap/1.1/$resource/$action"
|
19
21
|
|
20
22
|
if [ "$action"=="list" ] && [ -n "$start" ]; then
|
21
23
|
url="$url?start=$start"
|
22
24
|
fi
|
23
25
|
|
26
|
+
# url="https://online.moysklad.ru/api/remap/1.1/entity/variant/metadata/characteristics/3e277152-78ac-11e4-7a07-673c000ca568"
|
24
27
|
echo $url >&2
|
25
28
|
curl --max-redirs 3 -is -u $MS_LOGIN:$MS_PASSWORD $url
|
26
29
|
|
@@ -0,0 +1,13 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Server: nginx/1.6.2
|
3
|
+
Date: Wed, 11 Feb 2015 17:05:51 GMT
|
4
|
+
Content-Type: application/xml
|
5
|
+
Content-Length: 6444
|
6
|
+
Connection: close
|
7
|
+
Vary: Accept-Encoding
|
8
|
+
Cache-Control: max-age=0
|
9
|
+
Expires: Wed, 11 Feb 2015 17:05:51 GMT
|
10
|
+
Strict-Transport-Security: max-age=15552000
|
11
|
+
|
12
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
13
|
+
<good isSerialTrackable="false" buyPrice="0.0" weight="0.0" volume="0.0" minPrice="0.0" uomUuid="4d39c858-717b-4bba-aa48-cb9a9b1d80ea" countryUuid="7143be8a-b2f8-4a8a-acfd-8fda2fbf5875" salePrice="1000.0" archived="false" parentUuid="7398f10b-d204-4ef1-b6af-e7e051b300fb" productCode="" name="Тестовый товар – не удалять" updated="2015-02-11T19:51:28.642+03:00" updatedBy="ekaterina@citycycle" readMode="ALL" changeMode="SELF"><accountUuid>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountUuid><accountId>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountId><uuid>bb0cf1ed-b1ed-11e4-7a40-e89700085026</uuid><code></code><externalcode>-i3alIWbi2Q0HfWNTgS5p0</externalcode><description></description><attribute goodUuid="bb0cf1ed-b1ed-11e4-7a40-e89700085026" metadataUuid="6b08959c-b1ed-11e4-7a40-e89700084a06" doubleValue="88.544" updated="2015-02-11T15:58:53.152+03:00" updatedBy="admin@citycycle" readMode="ALL" changeMode="SELF"><accountUuid>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountUuid><accountId>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountId><uuid>bb0cf8ff-b1ed-11e4-7a40-e8970008502c</uuid></attribute><attribute goodUuid="bb0cf1ed-b1ed-11e4-7a40-e89700085026" metadataUuid="30ef6a10-985d-11e4-90a2-8ecb00a7e836" booleanValue="false" updated="2015-02-11T15:58:53.152+03:00" updatedBy="admin@citycycle" readMode="ALL" changeMode="SELF"><accountUuid>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountUuid><accountId>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountId><uuid>bb0cfa5c-b1ed-11e4-7a40-e8970008502e</uuid></attribute><attribute goodUuid="bb0cf1ed-b1ed-11e4-7a40-e89700085026" metadataUuid="20346ffb-985d-11e4-90a2-8ecb00a7e821" booleanValue="false" updated="2015-02-11T15:58:53.152+03:00" updatedBy="admin@citycycle" readMode="ALL" changeMode="SELF"><accountUuid>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountUuid><accountId>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountId><uuid>bb0cf87a-b1ed-11e4-7a40-e8970008502b</uuid></attribute><attribute goodUuid="bb0cf1ed-b1ed-11e4-7a40-e89700085026" metadataUuid="6b0890b1-b1ed-11e4-7a40-e89700084a03" longValue="10000" updated="2015-02-11T15:58:53.152+03:00" updatedBy="admin@citycycle" readMode="ALL" changeMode="SELF"><accountUuid>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountUuid><accountId>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountId><uuid>bb0cf68d-b1ed-11e4-7a40-e89700085028</uuid></attribute><attribute goodUuid="bb0cf1ed-b1ed-11e4-7a40-e89700085026" metadataUuid="6b089454-b1ed-11e4-7a40-e89700084a05" updated="2015-02-11T19:51:28.642+03:00" updatedBy="ekaterina@citycycle" readMode="ALL" changeMode="SELF"><accountUuid>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountUuid><accountId>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountId><uuid>392bcd27-b20e-11e4-90a2-8ecb000ad930</uuid><file created="2015-02-11T19:51:23.363+03:00" filename="logo.png" miniatureUuid="3621a8f7-b20e-11e4-90a2-8ecb000ad8f7" name="logo.png" updated="2015-02-11T19:51:23.543+03:00" updatedBy="ekaterina@citycycle" readMode="ALL" changeMode="NONE"><accountUuid>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountUuid><accountId>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountId><uuid>3606423a-b20e-11e4-90a2-8ecb000ad8f6</uuid><externalcode>YvJUiPsFg2so7SyR5tnIV1</externalcode></file></attribute><attribute goodUuid="bb0cf1ed-b1ed-11e4-7a40-e89700085026" metadataUuid="6b089715-b1ed-11e4-7a40-e89700084a07" valueString="да" updated="2015-02-11T15:58:53.152+03:00" updatedBy="admin@citycycle" readMode="ALL" changeMode="SELF"><accountUuid>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountUuid><accountId>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountId><uuid>bb0cf7f7-b1ed-11e4-7a40-e8970008502a</uuid></attribute><attribute goodUuid="bb0cf1ed-b1ed-11e4-7a40-e89700085026" metadataUuid="fc04dc6a-985c-11e4-90a2-8ecb00a7e80e" booleanValue="false" updated="2015-02-11T15:58:53.152+03:00" updatedBy="admin@citycycle" readMode="ALL" changeMode="SELF"><accountUuid>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountUuid><accountId>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountId><uuid>bb0cf561-b1ed-11e4-7a40-e89700085027</uuid></attribute><attribute goodUuid="bb0cf1ed-b1ed-11e4-7a40-e89700085026" metadataUuid="6b0892fa-b1ed-11e4-7a40-e89700084a04" timeValue="2015-02-19T16:01:00+03:00" updated="2015-02-11T15:58:53.152+03:00" updatedBy="admin@citycycle" readMode="ALL" changeMode="SELF"><accountUuid>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountUuid><accountId>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountId><uuid>bb0cf75d-b1ed-11e4-7a40-e89700085029</uuid></attribute><attribute goodUuid="bb0cf1ed-b1ed-11e4-7a40-e89700085026" metadataUuid="6b089863-b1ed-11e4-7a40-e89700084a08" valueText="http://citycycle.ru" updated="2015-02-11T15:58:53.152+03:00" updatedBy="admin@citycycle" readMode="ALL" changeMode="SELF"><accountUuid>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountUuid><accountId>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountId><uuid>bb0cf99a-b1ed-11e4-7a40-e8970008502d</uuid></attribute><salePrices><price priceTypeUuid="79e988f6-9ec8-4c43-99e8-964dfbfc5fd3" value="0.0" readMode="ALL" changeMode="ALL"><accountUuid>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountUuid><accountId>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountId><uuid>bb0cfe76-b1ed-11e4-7a40-e89700085034</uuid></price><price priceTypeUuid="3aad66f6-f4f9-4531-a692-1a496c478e13" value="1000.0" readMode="ALL" changeMode="ALL"><accountUuid>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountUuid><accountId>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountId><uuid>bb0cfdcf-b1ed-11e4-7a40-e89700085032</uuid></price><price priceTypeUuid="2a2661c5-8c8a-449c-ab86-f9230455b668" value="0.0" readMode="ALL" changeMode="ALL"><accountUuid>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountUuid><accountId>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountId><uuid>bb0cfd76-b1ed-11e4-7a40-e89700085031</uuid></price><price priceTypeUuid="c277a779-4753-11e3-f9a9-7054d21a8d1e" value="0.0" readMode="ALL" changeMode="ALL"><accountUuid>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountUuid><accountId>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountId><uuid>bb0cfe23-b1ed-11e4-7a40-e89700085033</uuid></price><price priceTypeUuid="5f60590b-713d-4c75-a0fc-88ffc666b212" value="0.0" readMode="ALL" changeMode="ALL"><accountUuid>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountUuid><accountId>49933001-0e7b-11e2-ef0e-3c4a92f3a0a7</accountId><uuid>bb0cfce9-b1ed-11e4-7a40-e89700085030</uuid></price></salePrices><preferences/><images/></good>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
Server: nginx/1.6.2
|
3
|
+
Date: Wed, 12 Aug 2015 07:20:48 GMT
|
4
|
+
Content-Type: application/xml
|
5
|
+
Content-Length: 4799
|
6
|
+
Connection: close
|
7
|
+
Vary: Accept-Encoding
|
8
|
+
Cache-Control: max-age=0
|
9
|
+
Expires: Wed, 12 Aug 2015 07:20:48 GMT
|
10
|
+
Strict-Transport-Security: max-age=15552000
|
11
|
+
|
12
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
13
|
+
<collection total="2" start="0" count="1000">
|
14
|
+
<workflow name="Company" updated="2015-05-21T08:26:33.431+03:00" updatedBy="admin@12storeez"><accountUuid>f147c89f-ff79-11e4-90a2-8ecb00000414</accountUuid><accountId>f147c89f-ff79-11e4-90a2-8ecb00000414</accountId><uuid>f16989a0-ff79-11e4-90a2-8ecb0000fdf2</uuid><code>Company</code><externalcode>tN7veej4jMS9KcyyK-vHX3</externalcode><state name="Новый" updated="2015-05-21T08:26:33.431+03:00" updatedBy="admin@12storeez"><accountUuid>f147c89f-ff79-11e4-90a2-8ecb00000414</accountUuid><accountId>f147c89f-ff79-11e4-90a2-8ecb00000414</accountId><uuid>f1698cf1-ff79-11e4-90a2-8ecb0000fdf3</uuid><externalcode>cQXl6qZWgwrSwAdI1uKVO1</externalcode></state><state name="Выслано предложение" updated="2015-05-21T08:26:33.431+03:00" updatedBy="admin@12storeez"><accountUuid>f147c89f-ff79-11e4-90a2-8ecb00000414</accountUuid><accountId>f147c89f-ff79-11e4-90a2-8ecb00000414</accountId><uuid>f1698f6d-ff79-11e4-90a2-8ecb0000fdf4</uuid><externalcode>Rfoga-j9hOdp1Vwcxggdj1</externalcode></state><state name="Переговоры" updated="2015-05-21T08:26:33.431+03:00" updatedBy="admin@12storeez"><accountUuid>f147c89f-ff79-11e4-90a2-8ecb00000414</accountUuid><accountId>f147c89f-ff79-11e4-90a2-8ecb00000414</accountId><uuid>f1699170-ff79-11e4-90a2-8ecb0000fdf5</uuid><externalcode>IALPXyAfiblZtZBvuGKh00</externalcode></state><state name="Сделка заключена" updated="2015-05-21T08:26:33.431+03:00" updatedBy="admin@12storeez"><accountUuid>f147c89f-ff79-11e4-90a2-8ecb00000414</accountUuid><accountId>f147c89f-ff79-11e4-90a2-8ecb00000414</accountId><uuid>f169936c-ff79-11e4-90a2-8ecb0000fdf6</uuid><externalcode>2QbEgpjIiYTHPtHKZm4g02</externalcode></state><state name="Сделка не заключена" updated="2015-05-21T08:26:33.431+03:00" updatedBy="admin@12storeez"><accountUuid>f147c89f-ff79-11e4-90a2-8ecb00000414</accountUuid><accountId>f147c89f-ff79-11e4-90a2-8ecb00000414</accountId><uuid>f169959e-ff79-11e4-90a2-8ecb0000fdf7</uuid><externalcode>B9gtJ6eFjxcgerTWLWMoB2</externalcode></state></workflow><workflow name="CustomerOrder" updated="2015-05-21T08:26:33.440+03:00" updatedBy="admin@12storeez"><accountUuid>f147c89f-ff79-11e4-90a2-8ecb00000414</accountUuid><accountId>f147c89f-ff79-11e4-90a2-8ecb00000414</accountId><uuid>f16b098e-ff79-11e4-90a2-8ecb0000fdf8</uuid><code>CustomerOrder</code><externalcode>i1qBfRLng9DjiavLTYbQY3</externalcode><state name="Новый" updated="2015-05-21T08:26:33.440+03:00" updatedBy="admin@12storeez"><accountUuid>f147c89f-ff79-11e4-90a2-8ecb00000414</accountUuid><accountId>f147c89f-ff79-11e4-90a2-8ecb00000414</accountId><uuid>f16b0ca9-ff79-11e4-90a2-8ecb0000fdf9</uuid><externalcode>5KVb7kdAhZQWTzDjJua8Y2</externalcode></state><state name="Подтвержден" updated="2015-05-21T08:26:33.441+03:00" updatedBy="admin@12storeez"><accountUuid>f147c89f-ff79-11e4-90a2-8ecb00000414</accountUuid><accountId>f147c89f-ff79-11e4-90a2-8ecb00000414</accountId><uuid>f16b0eac-ff79-11e4-90a2-8ecb0000fdfa</uuid><externalcode>Z1HGneBcgihh5oUNwoVZJ3</externalcode></state><state name="Собран" updated="2015-05-21T08:26:33.441+03:00" updatedBy="admin@12storeez"><accountUuid>f147c89f-ff79-11e4-90a2-8ecb00000414</accountUuid><accountId>f147c89f-ff79-11e4-90a2-8ecb00000414</accountId><uuid>f16b10db-ff79-11e4-90a2-8ecb0000fdfb</uuid><externalcode>a5XhhUNdhQWi33lXkUVap1</externalcode></state><state name="Отгружен" updated="2015-05-21T08:26:33.441+03:00" updatedBy="admin@12storeez"><accountUuid>f147c89f-ff79-11e4-90a2-8ecb00000414</accountUuid><accountId>f147c89f-ff79-11e4-90a2-8ecb00000414</accountId><uuid>f16b1305-ff79-11e4-90a2-8ecb0000fdfc</uuid><externalcode>zO4xNkffjTeQbbkURlq8N2</externalcode></state><state name="Доставлен" updated="2015-05-21T08:26:33.441+03:00" updatedBy="admin@12storeez"><accountUuid>f147c89f-ff79-11e4-90a2-8ecb00000414</accountUuid><accountId>f147c89f-ff79-11e4-90a2-8ecb00000414</accountId><uuid>f16b153f-ff79-11e4-90a2-8ecb0000fdfd</uuid><externalcode>OVF255slisrP0zULxCJL73</externalcode></state><state name="Возврат" updated="2015-05-21T08:26:33.441+03:00" updatedBy="admin@12storeez"><accountUuid>f147c89f-ff79-11e4-90a2-8ecb00000414</accountUuid><accountId>f147c89f-ff79-11e4-90a2-8ecb00000414</accountId><uuid>f16b183a-ff79-11e4-90a2-8ecb0000fdfe</uuid><externalcode>6yBHyHuEjYXFiumpAvz071</externalcode></state><state name="Отменен" updated="2015-05-21T08:26:33.441+03:00" updatedBy="admin@12storeez"><accountUuid>f147c89f-ff79-11e4-90a2-8ecb00000414</accountUuid><accountId>f147c89f-ff79-11e4-90a2-8ecb00000414</accountId><uuid>f16b1a44-ff79-11e4-90a2-8ecb0000fdff</uuid><externalcode>Q4o9Pn16gy9ALQmJqMsA80</externalcode></state></workflow>
|
15
|
+
</collection>
|
@@ -0,0 +1,39 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<good isSerialTrackable="false" weight="0.0" volume="0.0" supplierUuid="c64b1466-a5a2-11e5-7a69-97110001b177" minPrice="0.0" salePrice="499000.0" buyPrice="0.0" archived="false" parentUuid="951a2697-a5a0-11e5-7a69-971100010422" productCode="AJ-001-M-B/Bl/O" name="Nike air jordan 4 NEW 5" updated="2015-12-20T14:02:15.338+03:00" updatedBy="admin@bronx">
|
3
|
+
<accountUuid>1539f44c-a412-11e5-7a69-9711000014a3</accountUuid>
|
4
|
+
<accountId>1539f44c-a412-11e5-7a69-9711000014a3</accountId>
|
5
|
+
<uuid>0779df4f-a5a1-11e5-7a69-93a700078b39</uuid>
|
6
|
+
<groupUuid>153a5ed2-a412-11e5-7a69-9711000014a4</groupUuid>
|
7
|
+
<ownerUid>admin@bronx</ownerUid>
|
8
|
+
<shared>true</shared>
|
9
|
+
<code>5728</code>
|
10
|
+
<externalcode>5728</externalcode>
|
11
|
+
<description/>
|
12
|
+
<salePrices>
|
13
|
+
<price priceTypeUuid="155b00d1-a412-11e5-7a69-8f5500135f57" value="499000.0">
|
14
|
+
<accountUuid>1539f44c-a412-11e5-7a69-9711000014a3</accountUuid>
|
15
|
+
<accountId>1539f44c-a412-11e5-7a69-9711000014a3</accountId>
|
16
|
+
<uuid>0779e72a-a5a1-11e5-7a69-93a700078b3d</uuid>
|
17
|
+
<groupUuid>153a5ed2-a412-11e5-7a69-9711000014a4</groupUuid>
|
18
|
+
<ownerUid>admin@bronx</ownerUid>
|
19
|
+
<shared>true</shared>
|
20
|
+
</price>
|
21
|
+
</salePrices>
|
22
|
+
<barcode barcode="2000000059280" barcodeType="EAN13">
|
23
|
+
<accountUuid>1539f44c-a412-11e5-7a69-9711000014a3</accountUuid>
|
24
|
+
<accountId>1539f44c-a412-11e5-7a69-9711000014a3</accountId>
|
25
|
+
<uuid>0779e5fc-a5a1-11e5-7a69-93a700078b3c</uuid>
|
26
|
+
<groupUuid>153a5ed2-a412-11e5-7a69-9711000014a4</groupUuid>
|
27
|
+
<ownerUid>admin@bronx</ownerUid>
|
28
|
+
<shared>true</shared>
|
29
|
+
</barcode>
|
30
|
+
<preferences/>
|
31
|
+
<images>
|
32
|
+
<image tinyUuid="fe686a63-a708-11e5-7a69-971100051bcf" created="2015-12-20T14:01:17.290+03:00" filename="715ef5cffd4c1a183cba3aadfe549fd2.png" miniatureUuid="fec2f1a9-a708-11e5-7a69-971100051bd6" name="715ef5cffd4c1a183cba3aadfe549fd2" updated="2015-12-20T14:01:17.290+03:00" updatedBy="admin@bronx">
|
33
|
+
<accountUuid>1539f44c-a412-11e5-7a69-9711000014a3</accountUuid>
|
34
|
+
<accountId>1539f44c-a412-11e5-7a69-9711000014a3</accountId>
|
35
|
+
<uuid>fe700e25-a708-11e5-7a69-971100051bd0</uuid>
|
36
|
+
<externalcode>VXgiz18ZgWNgMtS-BsdYU1</externalcode>
|
37
|
+
</image>
|
38
|
+
</images>
|
39
|
+
</good>
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe Moysklad::Entities::CustomerOrder do
|
4
4
|
context 'generate' do
|
5
5
|
subject {
|
6
|
-
p= Moysklad::Entities::CustomerOrderPosition.new
|
6
|
+
p= Moysklad::Entities::CustomerOrderPosition.new
|
7
7
|
p.vat = 18
|
8
8
|
p.basePrice = Moysklad::Entities::Price.new
|
9
9
|
p.basePrice.sum = 123
|
@@ -17,6 +17,12 @@ describe Moysklad::Entities::CustomerOrder do
|
|
17
17
|
co
|
18
18
|
}
|
19
19
|
|
20
|
+
it 'state' do
|
21
|
+
stub_rest 'Workflow', :list, 0
|
22
|
+
allow(subject).to receive(:stateUuid).and_return 'f16b0ca9-ff79-11e4-90a2-8ecb0000fdf9'
|
23
|
+
expect(subject.state universe).to be_a Moysklad::Entities::WorkflowState
|
24
|
+
end
|
25
|
+
|
20
26
|
it 'to_xml' do
|
21
27
|
expect(subject.to_xml).to be_a String
|
22
28
|
end
|
@@ -49,5 +55,4 @@ describe Moysklad::Entities::CustomerOrder do
|
|
49
55
|
expect(subject.to_xml).to include "<customerOrderPosition"
|
50
56
|
end
|
51
57
|
end
|
52
|
-
|
53
58
|
end
|
@@ -43,4 +43,13 @@ describe Moysklad::Entities::Good do
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
describe 'image' do
|
47
|
+
let(:xml) { File.read './spec/fixtures/good_with_image.xml' }
|
48
|
+
subject { described_class.parse xml }
|
49
|
+
|
50
|
+
it do
|
51
|
+
expect(subject.images.image.count).to eq 1
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
46
55
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Moysklad::Resources::Workflows do
|
4
|
+
before do
|
5
|
+
stub_rest 'Workflow'
|
6
|
+
end
|
7
|
+
|
8
|
+
subject { described_class.new client: client }
|
9
|
+
|
10
|
+
it do
|
11
|
+
expect(subject.list.count).to eq 2
|
12
|
+
end
|
13
|
+
|
14
|
+
it do
|
15
|
+
expect(subject.send(:list_path)).to eq "exchange/rest/ms/xml/Workflow/list"
|
16
|
+
end
|
17
|
+
|
18
|
+
it do
|
19
|
+
expect(subject.list.first).to be_a Moysklad::Entities::Workflow
|
20
|
+
end
|
21
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -9,6 +9,7 @@ require 'faraday'
|
|
9
9
|
# https://github.com/vcr/vcr
|
10
10
|
require 'webmock/rspec'
|
11
11
|
require 'rspec/collection_matchers'
|
12
|
+
require 'pry'
|
12
13
|
|
13
14
|
Moysklad.logger = Logger.new '/dev/null'
|
14
15
|
Dir["./spec/support/**/*.rb"].sort.each { |f| require f}
|
@@ -42,7 +43,7 @@ RSpec.configure do |config|
|
|
42
43
|
# # => "be bigger than 2 and smaller than 4"
|
43
44
|
# ...rather than:
|
44
45
|
# # => "be bigger than 2"
|
45
|
-
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
46
|
+
# expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
46
47
|
end
|
47
48
|
|
48
49
|
# rspec-mocks config goes here. You can use an alternate test double
|
data/test.rb
ADDED
@@ -0,0 +1,177 @@
|
|
1
|
+
#!/bin/bash ruby
|
2
|
+
$LOAD_PATH.unshift './lib'
|
3
|
+
require 'moysklad'
|
4
|
+
require 'byebug'
|
5
|
+
require 'pry'
|
6
|
+
universe = Moysklad::Universe.build login: ENV['MS_LOGIN'], password: ENV['MS_PASSWORD']
|
7
|
+
|
8
|
+
|
9
|
+
# goods -> products
|
10
|
+
# good_folders -> productfolders
|
11
|
+
# features -> variants
|
12
|
+
# consignments -> assortments
|
13
|
+
# stock.listWithConsignments
|
14
|
+
# uom -> done
|
15
|
+
# warehouses
|
16
|
+
#
|
17
|
+
# custom_entities -> значения словарей (придется брать по-одному)
|
18
|
+
#
|
19
|
+
# custom_entity_metadata -> словари
|
20
|
+
# https://online.moysklad.ru/api/remap/1.1/entity/companysettings/metadata/
|
21
|
+
#
|
22
|
+
# https://online.moysklad.ru/api/remap/1.1/entity/product/metadata/
|
23
|
+
# https://online.moysklad.ru/api/remap/1.1/entity/variant/metadata/
|
24
|
+
#
|
25
|
+
# attributes + characteristics
|
26
|
+
#
|
27
|
+
# embeded_entity_metada -> свойства
|
28
|
+
#
|
29
|
+
# https://online.moysklad.ru/api/remap/1.1/entity/companysettings/metadata/
|
30
|
+
# https://online.moysklad.ru/api/remap/1.1/entity/variant/metadata/
|
31
|
+
# https://online.moysklad.ru/api/remap/1.1/entity/product/metadata/
|
32
|
+
#
|
33
|
+
# stores = universe.stores.all
|
34
|
+
|
35
|
+
# binding.pry
|
36
|
+
# puts universe.uoms.list
|
37
|
+
#
|
38
|
+
# Список словарей
|
39
|
+
# m = universe.company_settings_metadata
|
40
|
+
##
|
41
|
+
## Список аттрибутов
|
42
|
+
#dictionaries = m.customEntities
|
43
|
+
|
44
|
+
#dictionaries.each do |a|
|
45
|
+
#puts '---'
|
46
|
+
#puts a.meta.href
|
47
|
+
#puts a.entityMeta.href
|
48
|
+
#binding.pry
|
49
|
+
#puts a.entities(universe).map { |e| [e.id, e.name].join(':') }.join(', ')
|
50
|
+
#end
|
51
|
+
|
52
|
+
a = universe.counterparties.all(filter: { phone: '79033891228' })
|
53
|
+
|
54
|
+
|
55
|
+
binding.pry
|
56
|
+
|
57
|
+
# products = universe.products.all
|
58
|
+
|
59
|
+
o = universe.organizations.all
|
60
|
+
|
61
|
+
organization = o.first
|
62
|
+
|
63
|
+
cp = Moysklad::Entities::Counterparty.new(
|
64
|
+
name: 'Письменный Данил Викторович (test)',
|
65
|
+
externalCode: 'test-couterpaty',
|
66
|
+
actualAddress: 'Чебоксары, ул. Водопроводная, дом 7',
|
67
|
+
email: 'danil@brandymint.ru',
|
68
|
+
tags: ['kiiiosk'],
|
69
|
+
phone: '+79033891228'
|
70
|
+
)
|
71
|
+
agent = universe.counterparties.create cp
|
72
|
+
assortment = {
|
73
|
+
meta: {
|
74
|
+
"href"=>"https://online.moysklad.ru/api/remap/1.1/entity/product/022528e1-fcfe-11e6-7a69-97110054d4e7",
|
75
|
+
"metadataHref"=>"https://online.moysklad.ru/api/remap/1.1/entity/product/metadata",
|
76
|
+
"type"=>"product",
|
77
|
+
"mediaType"=>"application/json"
|
78
|
+
}
|
79
|
+
}
|
80
|
+
positions = [
|
81
|
+
Moysklad::Entities::CustomerOrderPosition.new(
|
82
|
+
quantity: 1,
|
83
|
+
price: 123,
|
84
|
+
discount: 0,
|
85
|
+
vat: 0,
|
86
|
+
reserve: 1,
|
87
|
+
assortment: assortment
|
88
|
+
)
|
89
|
+
]
|
90
|
+
customer_order = Moysklad::Entities::CustomerOrder.new(
|
91
|
+
name: "TEST-#{Time.now.to_i}",
|
92
|
+
code: '123456',
|
93
|
+
moment: Moysklad::Entities::Time.now,
|
94
|
+
vatEnabled: false,
|
95
|
+
applicable: false,
|
96
|
+
organization: organization,
|
97
|
+
agent: agent,
|
98
|
+
# state: state,
|
99
|
+
positions: positions,
|
100
|
+
description: 'Тестовый заказ'
|
101
|
+
)
|
102
|
+
|
103
|
+
order = universe.customer_orders.create customer_order
|
104
|
+
|
105
|
+
binding.pry
|
106
|
+
puts order
|
107
|
+
|
108
|
+
# puts universe.currencies.findWhere isoCode: '643'
|
109
|
+
# Получаем рекурсивно действительно все значения
|
110
|
+
#custom_entities = universe.all_custom_entities
|
111
|
+
#binding.pry
|
112
|
+
#puts custom_entities.count
|
113
|
+
#
|
114
|
+
# Все элементы словаря
|
115
|
+
# list = universe.custom_entities(custom_entity_meta_id: 'e63c1592-807b-11e4-90a2-8ecb00113f68').all
|
116
|
+
# puts list
|
117
|
+
# attrs = universe.variants.metadata.attrs
|
118
|
+
# attr = attrs.first
|
119
|
+
# e63c1592-807b-11e4-90a2-8ecb00113f68
|
120
|
+
# entities = attr.entities universe
|
121
|
+
#id = "022528e1-fcfe-11e6-7a69-97110054d4e7"
|
122
|
+
#byebug
|
123
|
+
#products = universe.products.all(expand: :productFolder)
|
124
|
+
#byebug
|
125
|
+
#products.each do |p|
|
126
|
+
#puts p.dump.to_json
|
127
|
+
## binding.pry if p.externalCode == 'fhiI8yDIjwC-1-kiIbSO62'
|
128
|
+
## puts "#{p.externalCode}\t#{p.id}\t#{p.name}"
|
129
|
+
#end
|
130
|
+
# product.image.download(client)
|
131
|
+
|
132
|
+
#products.rows.each do |p|
|
133
|
+
#binding.pry if p.attrs.count > 0
|
134
|
+
#end
|
135
|
+
|
136
|
+
|
137
|
+
#puts products.count
|
138
|
+
|
139
|
+
#products.rows.each do |p|
|
140
|
+
#next unless p.characteristics
|
141
|
+
#puts p.characteristics.map { |c| c.meta.href }
|
142
|
+
## #puts p.characteristics.join('; ')
|
143
|
+
#end
|
144
|
+
# puts products.metadata
|
145
|
+
#roduct = products.rows.first
|
146
|
+
|
147
|
+
# Товар с attributes
|
148
|
+
# product = universe.products.get "02bbdea5-dbde-11e6-7a69-8f55000f3f4e"
|
149
|
+
|
150
|
+
#product_folders = universe.productfolders.list
|
151
|
+
#puts product_folders.rows.map { |pf| pf['dump'] }
|
152
|
+
#puts product_folders.meta.size
|
153
|
+
#puts universe.productfolders.get product_folders.rows.first.id
|
154
|
+
|
155
|
+
# variants = universe.variants.list
|
156
|
+
# byebug
|
157
|
+
## puts variants.meta.size
|
158
|
+
#variants.rows.each do |v|
|
159
|
+
#next unless v.characteristics
|
160
|
+
#puts v.characteristics.map { |c| c.meta.href }
|
161
|
+
## puts v.characteristics.join('; ')
|
162
|
+
#end
|
163
|
+
#puts products.meta.size
|
164
|
+
## puts universe.variants.get variants.rows.first.id
|
165
|
+
##
|
166
|
+
# stores = universe.stores.list
|
167
|
+
#puts stores.meta.size
|
168
|
+
## puts universe.stores.get stores.rows.first.id
|
169
|
+
#
|
170
|
+
|
171
|
+
# consignments = universe.consignments.all
|
172
|
+
#
|
173
|
+
#stockstore_uri = universe.stores.all.last.meta.href
|
174
|
+
#puts stockstore_uri
|
175
|
+
#list = universe.assortments.all stockstore: stockstore_uri
|
176
|
+
#binding.pry
|
177
|
+
#puts list.count
|