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
@@ -1,38 +1,16 @@
1
+ require_relative 'attribute_value'
2
+
1
3
  module Moysklad::Entities
2
- # https://online.moysklad.ru/exchange/rest/ms/xml/Metadata/list
3
4
  class AttributeMetadata < Base
4
- include CommonObject
5
-
6
- tag 'attributeMetadata'
7
-
8
- # ID_CUSTOM - элемент из dictionary
9
- # TEXT
10
- # STRING
11
- attribute :attrType, String
12
- attribute :entityMetadataUuid, String
13
- attribute :feature, Boolean
14
- attribute :position, Integer
15
- attribute :required, Boolean
16
- attribute :dictionaryMetadataUuid, String
5
+ attribute :meta, Meta
6
+ attribute :id, String
7
+ attribute :name, String
8
+ attribute :type, String # string, customentity
9
+ attribute :required, Boolean
10
+ attribute :customEntityMeta, Meta
17
11
 
18
12
  def is_dictionary?
19
- attrType == 'ID_CUSTOM'
20
- end
21
-
22
- # Если это свойство типа ID_CUSTOM, то возвращается пользовательский справочник
23
- #
24
- # @return Moysklad::Entities::CustomEntityMetadata
25
- def dictionatyMetadata universe
26
- raise "Это свойства не типа справочник" unless dictionaryMetadataUuid
27
- universe.custom_entity_metadata.find dictionaryMetadataUuid
28
- end
29
-
30
- # Справочник к которому принадлежит это ссвойство
31
- #
32
- # @return Moysklad::Entities::EmbeddedEntityMetadata
33
- def entityMetadata universe
34
- universe.embedded_entity_metadata.find entityMetadataUuid
13
+ type == 'customentity'
35
14
  end
36
-
37
15
  end
38
16
  end
@@ -0,0 +1,19 @@
1
+ require_relative 'custom_entity'
2
+
3
+ module Moysklad::Entities
4
+ class AttributeValue < Virtus::Attribute
5
+ def coerce(value)
6
+ if value.is_a? String
7
+ value
8
+ elsif value.is_a? ::Hash
9
+ if value['meta']['type'] == 'customentity'
10
+ CustomEntity.new value
11
+ else
12
+ raise "Unknown meta type: #{value['meta']['type']}"
13
+ end
14
+ else
15
+ raise "Unknown value type (#{value}) #{value.class}"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,13 +1,19 @@
1
1
  module Moysklad::Entities
2
2
  class Barcode < Base
3
- include Common
3
+ include HappyMapper
4
+ include Moysklad::Entities::XmlFix
4
5
 
5
6
  tag 'barcode'
6
7
 
7
- attribute :barcode, String
8
- # EAN13
8
+ attribute :barcode, String
9
9
  attribute :barcodeType, String
10
10
 
11
+ attribute :accountUuid, String
12
+ attribute :accountId, String
13
+ attribute :uuid, String
14
+ attribute :groupUuid, String
15
+ attribute :ownerUuid, String
16
+
17
+ attribute :shared, Boolean
11
18
  end
12
19
  end
13
-
@@ -1,16 +1,31 @@
1
1
  module Moysklad::Entities
2
2
  class Base
3
- #include Object
3
+ include Virtus.model
4
+ attr_accessor :universe
5
+ attr_accessor :dump
4
6
 
5
- private
7
+ def self.build(data, universe)
8
+ entity = new data
9
+ entity.universe = universe
10
+ entity
11
+ end
12
+
13
+ def initialize(data = {})
14
+ data['attrs'] = data.delete 'attributes' if data['attributes']
15
+ super (data || {}).merge(dump: data)
16
+ end
6
17
 
7
- def cache ns, key
8
- @cache||={}
9
- @cache[ns]||={}
10
- cc = @cache[ns]
18
+ def to_json(*args)
19
+ presented = {}
20
+ to_h.each_pair do |k, v|
21
+ presented[k] = v unless v.nil?
22
+ end
23
+
24
+ presented.to_json
25
+ end
11
26
 
12
- cc[key] = yield unless cc.has_key? key
13
- cc[key]
27
+ def to_s
28
+ attributes.to_s
14
29
  end
15
30
  end
16
31
  end
@@ -0,0 +1,39 @@
1
+ module Moysklad::Entities
2
+ # Комплект
3
+ # https://online.moysklad.ru/api/remap/1.1/doc/index.html#комплект
4
+ class Bundle < Product
5
+ #meta - Метаданные объекта
6
+ #id - ID Комплекта в формате UUID Только для чтения
7
+ #accountId - ID учетной записи Только для чтения
8
+ #owner - Ссылка на Владельца (Сотрудника) в формате Метаданных
9
+ #shared - Общий доступ
10
+ #group - Отдел сотрудника в формате Метаданных
11
+ #syncId - ID синхронизации Только для чтения
12
+ #version - Версия сущности Только для чтения
13
+ #updated - Момент последнего обновления сущности Только для чтения
14
+ #name - Наименование Комплекта Необходимое
15
+ #description - Описание Комплекта
16
+ #code - Код Комплекта
17
+ #externalCode - Внешний код Комплекта
18
+ #archived - Отметка о том, добавлен ли Комплект в архив
19
+ #pathName - Наименование группы, в которую входит Комплект Только для чтения
20
+ #vat - НДС %
21
+ #effectiveVat - Реальный НДС % Только для чтения
22
+ #productFolder - Ссылка на группу Комплекта
23
+ #uom - Единицы измерения
24
+ #image - Изображение Комплекта Только для чтения
25
+ #minPrice - Минимальная цена
26
+ #salePrices - Цены продажи
27
+ #attributes - Коллекция доп. полей в формате Метаданных
28
+ #country - Ссылка на страну в формате Метаданных
29
+ #article - Артикул
30
+ #weight - Вес
31
+ #volume - Объём
32
+ #barcodes - Массив штрихкодов Комплекта
33
+ #overhead - Дополнительные расходы
34
+ #currency - Валюта доп расходов
35
+ #value - Значение доп расходов
36
+ #components - Компоненты Комплекта
37
+
38
+ end
39
+ end
@@ -0,0 +1,6 @@
1
+ require_relative 'attribute'
2
+
3
+ module Moysklad::Entities
4
+ class Characteristic < Attribute
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ require_relative 'attribute_metadata'
2
+
3
+ module Moysklad::Entities
4
+ class CharacteristicMetadata < AttributeMetadata
5
+ end
6
+ end
@@ -1,12 +1,35 @@
1
+ require_relative 'context'
2
+ require_relative 'collection_meta'
3
+
1
4
  module Moysklad::Entities
2
- class Collection < Base
3
- # Типовое количество элементов которое возвращает мойсклад
4
- DEFAULT_COUNT = 1000
5
- include HappyMapper
5
+ class RowItems < Virtus::Attribute
6
+ include ActiveSupport::Inflector
7
+
8
+ def coerce(items)
9
+ items.map do |item|
10
+ type = item['meta']['type']
11
+ entity_class = find_entity_class type
12
+ entity_class.new item
13
+ end
14
+ end
6
15
 
7
- attribute :total, Integer
8
- attribute :start, Integer
9
- attribute :count, Integer
16
+ private
10
17
 
18
+ def find_entity_class(type)
19
+ case type
20
+ when 'customentity'
21
+ Moysklad::Entities::CustomEntity
22
+ else
23
+ class_name = 'Moysklad::Entities::' + camelize(type)
24
+ raise Moysklad::Error, "No entity class for #{type} type" unless Object.const_defined? class_name
25
+ constantize class_name
26
+ end
27
+ end
28
+ end
29
+
30
+ class Collection < Base
31
+ attribute :context, Context
32
+ attribute :meta, CollectionMeta
33
+ attribute :rows, RowItems
11
34
  end
12
35
  end
@@ -0,0 +1,11 @@
1
+ module Moysklad::Entities
2
+ class CollectionMeta < Meta
3
+ # Следующие атрибуты объекта meta появляются, как правило, в методах выдачи списка сущностей/строк отчёта
4
+ attribute :size, Integer
5
+ attribute :limit, Integer
6
+ attribute :offset, Integer
7
+
8
+ attribute :nextHref, String
9
+ attribute :prevHref, String
10
+ end
11
+ end
@@ -24,6 +24,4 @@ module Moysklad::Entities::CommonObject
24
24
  element :externalcode, String
25
25
  element :description, String
26
26
  end
27
-
28
27
  end
29
-
@@ -0,0 +1,28 @@
1
+ require_relative 'meta'
2
+
3
+ module Moysklad::Entities
4
+ class EntityMeta < Base
5
+ attribute :href, String
6
+ attribute :type, String
7
+ attribute :mediaType, String
8
+ end
9
+
10
+ class CompanySettingsCustomEntity < Base
11
+ attribute :meta, Meta
12
+ attribute :entityMeta, EntityMeta
13
+ attribute :name, String
14
+
15
+ def id
16
+ meta.id
17
+ end
18
+
19
+ def entities(universe)
20
+ Moysklad::Resources::CustomEntities.indexed(client: universe.client, list_path: entityMeta.href).all
21
+ end
22
+ end
23
+
24
+ class CompanySettingsMetadata < Base
25
+ attribute :meta, Meta
26
+ attribute :customEntities, Array[CompanySettingsCustomEntity]
27
+ end
28
+ end
@@ -1,22 +1,24 @@
1
- module Moysklad::Entities
2
- # https://online.moysklad.ru/exchange/rest/ms/xml/Consignment/list
3
- class Consignment < Base
4
- include Common
5
-
6
- tag 'consignment'
7
-
8
- attribute :updated, Time
9
- attribute :updatedBy, String
1
+ require_relative 'entity'
2
+ require_relative 'assortment'
10
3
 
11
- attribute :name, String
12
-
13
- attribute :goodUuid, String
14
- attribute :isDefault, Boolean
15
-
16
- attribute :archived, Boolean
4
+ module Moysklad::Entities
5
+ class Consignment < Entity
6
+ attribute :meta, Meta
7
+ attribute :id, String
8
+ attribute :version, Integer
9
+ attribute :updated, String
10
+ attribute :name, String
11
+ attribute :label, String
12
+ attribute :externalCode, String
13
+ attribute :archived, Boolean
17
14
 
18
- element :externalcode, String
15
+ attribute :accountId, String
16
+ attribute :assortment, Assortment
19
17
 
20
- has_one :feature, Moysklad::Entities::Feature
18
+ # Когда загружаем через ассортименты эти поля устанавливаются
19
+ attribute :stock, Float
20
+ attribute :reserve, Float
21
+ attribute :inTransit, Float
22
+ attribute :quantity, Float
21
23
  end
22
24
  end
@@ -0,0 +1,9 @@
1
+ require_relative 'employee'
2
+
3
+ module Moysklad::Entities
4
+ class Context
5
+ include Virtus.model
6
+
7
+ attribute :employee, Employee
8
+ end
9
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'entity'
2
+
3
+ module Moysklad::Entities
4
+ class Counterparty < Entity
5
+ attribute :email, String
6
+ attribute :phone, String
7
+ attribute :fax, String
8
+ attribute :tags, Array[String]
9
+
10
+ attribute :actualAddress, String
11
+ attribute :legalTitle, String
12
+ attribute :legalAddress, String
13
+ attribute :inn, String
14
+ attribute :kpp, String
15
+ attribute :ogrn, String
16
+ attribute :okpo, String
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ require_relative 'meta'
2
+
3
+ module Moysklad::Entities
4
+ class Currency < Base
5
+ class Unit < Base
6
+ attribute :gender, String
7
+ attribute :s1, String
8
+ attribute :s2, String
9
+ attribute :s5, String
10
+ end
11
+ attribute :meta, Meta
12
+ attribute :system, Boolean
13
+ attribute :name, String
14
+ attribute :fullName, String
15
+ attribute :rate, Float
16
+ attribute :multiplicity, Integer
17
+ attribute :rateUpdateType, String
18
+ attribute :code, String
19
+ attribute :isoCode, String
20
+ attribute :majorUnit, Unit
21
+ attribute :minorUnit, Unit
22
+ attribute :archived, Boolean
23
+ attribute :default, Boolean
24
+
25
+ def id
26
+ meta.href.split('/').last
27
+ end
28
+ end
29
+ end
@@ -1,18 +1,28 @@
1
- # https://online.moysklad.ru/exchange/rest/ms/xml/CustomEntity/list
2
- # Элемент пользовательского справочника
3
- # (значения перечисляемых свойств)
1
+ require_relative 'meta'
2
+ require_relative 'context'
3
+
4
+ # Элемент в справочнике (DictionaryEntity)
4
5
  module Moysklad::Entities
5
6
  class CustomEntity < Base
6
- include CommonObject
7
- include XmlFix
8
-
9
- tag 'customEntity'
7
+ attribute :meta, Meta
8
+ attribute :accountId, String
9
+ attribute :id, String
10
+ attribute :name, String
11
+ attribute :externalCode, String
12
+ attribute :description, String
10
13
 
11
- attribute :entityMetadataUuid, String
14
+ # TODO remove
15
+ def entityMetadataUuid
16
+ dictionaryId
17
+ end
12
18
 
13
- def entityMetadata universe
14
- universe.custom_entity_metadata.find entityMetadataUuid
19
+ # ID Словаря
20
+ def dictionaryId
21
+ meta.metadataHref.split('/').last
15
22
  end
16
23
 
24
+ def to_s
25
+ name
26
+ end
17
27
  end
18
28
  end
@@ -1,36 +1,11 @@
1
- # https://online.moysklad.ru/exchange/rest/ms/xml/CustomEntityMetadata/list
2
- #
3
- # Пользовательский справочник
4
- #
1
+ require_relative 'meta'
2
+ raise 'не используется'
5
3
  module Moysklad::Entities
6
4
  class CustomEntityMetadata < Base
7
- include CommonObject
8
- include XmlFix
9
-
10
- tag 'customEntityMetadata'
11
-
12
- attribute :uniqueCode, Boolean
13
- attribute :codeValueType, Integer
14
- attribute :independentNameGenerator, Boolean
15
-
16
- attribute :partialReserve, Boolean
17
-
18
- attribute :editOnlyByAuthor, Boolean
19
-
20
- attribute :noEditFromOtherPlaceSource, Boolean
21
-
22
- attribute :noApplicableFromOtherPlaceSource, Boolean
23
-
24
- attribute :noEditFromOtherPlaceTarget, Boolean
25
-
26
- attribute :noApplicableFromOtherPlaceTarget, Boolean
27
-
28
- # Список перечисляемых значений данного справочника
29
- #
30
- # @return [Array[CustomEntity]]
31
- def entities universe
32
- universe.custom_entities.where entityMetadataUuid: uuid
33
- end
34
-
5
+ attribute :meta, Meta
6
+ attribute :id, String
7
+ attribute :name, String
8
+ attribute :type, String # string, customentity
9
+ attribute :required, Boolean
35
10
  end
36
11
  end