{"id":18836654,"url":"https://github.com/dapi/moysklad","last_synced_at":"2025-04-14T05:31:19.233Z","repository":{"id":23078021,"uuid":"26431736","full_name":"dapi/moysklad","owner":"dapi","description":"Правильный Ruby-клиент для работы c REST XML API moyslad.ru","archived":false,"fork":false,"pushed_at":"2024-04-07T16:50:56.000Z","size":577,"stargazers_count":14,"open_issues_count":5,"forks_count":4,"subscribers_count":8,"default_branch":"master","last_synced_at":"2024-10-01T14:46:12.397Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"moysklad.ru","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dapi.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2014-11-10T10:24:09.000Z","updated_at":"2024-04-02T21:04:23.000Z","dependencies_parsed_at":"2022-08-20T23:40:20.110Z","dependency_job_id":"7661dcd2-9368-4210-b45c-c0fb32dbc694","html_url":"https://github.com/dapi/moysklad","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dapi%2Fmoysklad","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dapi%2Fmoysklad/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dapi%2Fmoysklad/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dapi%2Fmoysklad/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dapi","download_url":"https://codeload.github.com/dapi/moysklad/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":223620981,"owners_count":17174651,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T02:25:08.325Z","updated_at":"2024-11-08T02:25:08.856Z","avatar_url":"https://github.com/dapi.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"#  Ruby-клиент для REST XML API Moysklad\n\n[![Build Status](https://travis-ci.org/BrandyMint/moysklad.svg)](https://travis-ci.org/dapi/moysklad)\n[![Dependency Status](https://www.versioneye.com/user/projects/548225818674a4b5b90004dd/badge.svg?style=flat)](https://www.versioneye.com/user/projects/548225818674a4b5b90004dd)\n[![Code Climate](https://codeclimate.com/github/dapi/moysklad/badges/gpa.svg)](https://codeclimate.com/github/dapi/moysklad)\n\n* http://www.rubydoc.info/gems/moysklad\n\n## Особенности\n\n* Модуль разработан согласно принципам SOLID. Легко расширяем.\n* Все используемые сущности описаны и структурированы. Например [Good](lib/moysklad/entities/good.rb)\n* Любые действия с ресурсами (Create, Read, Update, Delete, List).\n* Виртуальные действия с ресурсами (`where`, `findWhere`)\n* Автоматическая подгрузка списка если все данные не уместились в один запрос (метод `all`)\n* _Кеширование и предзагрузка_ ресурса со всеми записями (используем ресурс как локальную базу)\n* Работа с нескольмими аккаунтами склада одновременно (отсуствие глобальных переменных).\n* Удобная работа с подресурсами (например справочником свойств товара)\n* _Ассоциации_ между сущностями автоматически получают данные по API (`good.features`).\n* [Client](lib/moysklad/client.rb) для прямого обращения к API в случае крайней необходимости.\n\n## Установка\n\nВсе, как обычно, добавляем в Gemfile:\n\n    gem 'moysklad'\n\n## Использование\n\nСоздаем благоприятное окружение для работы с API:\n\n```ruby\nuniverse = Moysklad::Universe.build login:'ВАШ ЛОГИН', password:'ВАШ ПАРОЛЬ'\n```\n\n### Список элементов.\n\nНапример список товаров (`Good`).\n\n```ruby\nuniverse.goods.list\n# =\u003e [Moysklad::Entities::Good, Moysklad::Entities::Good, ..]\n```\n\nОбратите внимание, что список возвращается \"как есть\" и для работы с ним есть более удобные методы.\n\nПараметры списка.\n\n```ruby\nuniverse.stock.list slotUuid: uuid\n```\n\nСтраница товаров:\n\n```ruby\npage = universe.goods.page\n# =\u003e Moysklad::Entities::Page\n\npage.total\n# =\u003e 1280\n\npage.count\n# =\u003e 1000\n\npage.start\n# =\u003e 0\n\n# page.items\n# =\u003e[Moysklad::Entities::Good, ..]\n\nЕсть очень удобная возможность автоматически загрузать ВСЕ товары с учетом пейджирования:\n\n\u003e goods = universe.goods.all\n\u003e goods.count\n\u003e =\u003e 1280\n\n\u003e goods\n\u003e =\u003e [Moysklad::Entities::Page]\n```\n\n### Получить конкретный элемент\n\n```ruby\nuniverse.goods.get $uuid\n# =\u003e [Moysklad::Entities::Good]\n```\n\n### Создаем элемент\n\nНапример загрузка заказа покупателя:\n\n```ruby\nco = Moysklad::Entities::CustomerOrder.new\nco.vatIncluded = true\nco.applicable  = true\n[...]\nco.customerOrderPosition = [Moysklad::Entities::CustomerOrderPosition.new]\n\ncreated_order = universe.customer_orders.create co\n# =\u003e [Moysklad::Entities::Good]\n\ncreated_order.uuid\n# =\u003e uuid нового заказа\n```\n\n### Удаляем элемент\n\n```ruby\nuniverse.goods.delete $uuid\n```\n\n### Кеширование и предзагрузка\n\nОдной из главных возможностей данного модуля является возможность работать с API как с базой данных,\nне выполняя запрос по получению каждого товара по-отдельности, и выдавать данные их кеша.\n\nКласический способ получить данные по товару делает GET запрос каждый раз:\n\n```ruby\nuniverse.goods.get $uuid\n# =\u003e Client: GET exchange/rest/ms/xml/Good/f24937e7-7ba1-11e4-90a2-8ecb000abf12 {}\n# =\u003e [Moysklad::Entities::Good]\n```\n\nПродвинутый способ вытаскивает все данные сразу и в дальнейшем берет обьекты из кеша:\n\n```ruby\n\u003e universe.goods.find $uuid\n# =\u003e Client: GET exchange/rest/ms/xml/Good/list {:start=\u003e0}\n# =\u003e Client: GET exchange/rest/ms/xml/Good/list {:start=\u003e1000}\n# =\u003e [Moysklad::Entities::Good]\n```\n\nИ в следующий раз API уже не дергается:\n\n```ruby\nuniverse.goods.find $another_uuid\n# =\u003e [Moysklad::Entities::Good]\n```\n\nЭто позволяет экономить на прямых запросах к API и избавляет нас от блокирования моимскладом по ограничению количества запросов за еденицу времени.\n\n\n## Поиск по фильтру\n\nВозвращает список элементов отображенных по фильтру:\n\n```ruby\nuniverse.features.where goodUuid: uuid\n# =\u003e [Moysklad::Enities::Feature, Moysklad::Enities::Feature]\n```\n\nТоже самое, только возвращается первый элемент или nil:\n\n```ruby\nuniverse.features.findWhere goodUuid: uuid\n# =\u003e [Moysklad::Enities::Feature]\n```\n\n### Список доступных ресурсов:\n\n```ruby\nuniverse.resources_list\n# =\u003e [:stock, :embedded_entity_metadata, :custom_entity_metadata, :goods, :good_folders, :uoms, :countries,\n      :features, :custom_entities, :customer_orders, :warehouses, :companies,\n      :consignments, :my_companies]\n```\n\n## Справочники и подресурсы\n\nДоступ к Мойсклад устроен так, что некоторые справочники запрятаны в одной коллекции.\nНапример если вы хотите получить все виды свойств товаров, то это можно сделать следующим образом.\n\n```ruby\nuniverse.embedded_entity_metadata.subresource_by_name(:GoodFolder).all\n# =\u003e [Moysklad::Entities::AttributeMetadata, Moysklad::Entities::AttributeMetadata]\n```\n\nИли получить конкретное свойство:\n\n```ruby\nuniverse.embedded_entity_metadata.subresource_by_name(:GoodFolder).find uuid\n# =\u003e Moysklad::Entities::AttributeMetadata\n```\n\n## Автоматическая обработка ассоциаций (отношения)\n\nНравятся `belongs_to` и `has_many` в рельсах? Тут есть почти тоже самое.\n\n```ruby\nfeature = universe.features.find uuid\nfeature.good\n# Client: GET exchange/rest/ms/xml/Good/f24937e7-7ba1-11e4-90a2-8ecb000abf12 {}\n# =\u003e [Moysklad::Entities::Good]\n```\n\nПример как получить все данные по товару, включая модификации, свойства и их характеристики:\n\n```ruby\ngood = universe.goods.find uuid\n# Client: GET exchange/rest/ms/xml/Good/f24937e7-7ba1-11e4-90a2-8ecb000abf12 {}\n\ngood.features universe\n# Client: GET exchange/rest/ms/xml/Feature/list {}\n# =\u003e [Moysklad::Entities::Feature, ..]\n\nattribute = good.attributes.first\n# =\u003e [Moysklad::Entities::Attribute, ..]\n\nattribute.is_dictionary?\n# =\u003e true\n```\n\nПолучаем вид свойства:\n\n```ruby\nattribute.embedded_entity_metadata universe\n# Client: GET exchange/rest/ms/xml/Metadata/list {}\n# =\u003e [Moysklad::Entities::AttributeMetadata]\n```\n\nПолучаем описание пользовательского справочника к которому принадлежит свойства\n\n```ruby\ndictionary = attribute.embedded_entity_metadata(universe).dictionatyMetadata(universe)\n# Client: GET exchange/rest/ms/xml/CustomEntityMetadata/uuid {}\n# =\u003e [Moysklad::Entities::CustomEntityMetadata]\n```\n\nЗначения всех элементов пользовательского справочника:\n\n```ruby\ndictionary.entities(universe)\n# =\u003e [Moysklad::Entities::CustomEntity, ...]\n```\n\nПодробнее смотри в исходниках сущностей.\n\n## Pull Requests\n\n### Добавление новых моделей и ресурсов.\n\nНа данный момен в библиотеку добавлено 60% справочников используемых в моемскладе. Я добавляю новые справочники по мере необходимости. Но вы можете это сделать и сами следующим образом.\n\nНапример добавляем `Country`.\n\n1. Добавляем в фикстуры пример выгрузки из API для тестирования и отладки:\n\n    MS_LOGON=логин MS_PASSWORD=пароль ./scripts/rest.sh Country list \u003e ./spec/fixtures/Country_list.raw\n\n2. Создаем сущность на основе уже существующей, например good.rb\n\n    cp ./lib/moysklad/entities/good.rb ./lib/moysklad/entities/country.rb\n\n3. Описываем свойства новой сущности Country.rb в терминах [nokogiri-happymapper](https://github.com/dam5s/happymapper)-а\n\n    vi ./lib/moysklad/entities/country.rb\n\n4. Добавляем сущность в requirements\n\n    vi ./lib/moysklad/entities.rb\n\n5. Содаем автоматический ресурс (имя ресурса во множественном числе)\n\n    vi ./lib/moysklad/resources.rb\n\n6. Делаем spec для сущности и для ресурса.\n\n    \u003e vi ./spec/lib/moysklad/resources/countries_spec.rb\n    \u003e vi ./spec/lib/moysklad/entities/country_spec.rb\n\n7. Проверяем что тесты проходят.\n\n8. Присылаем Pull Request\n\n## Тестирование\n\n    \u003e bundle exec guard\n\n## Полезняшки\n\nСкрипт для быстрого доступа к сервисам моего склада\n\n    \u003e MS_LOGON=логин MS_PASSWORD=пароль ./script/rest.sh Country list \u003e ./spec/fixtures/Country_list.raw\n\nЕсли получаете 429 ошибку (too many requests) - лимит обращений по API от одного\nаккаунта - 5 или 10 запросов в секунду (в секунду, Карл). Если не превышать его,\nвсе будет хорошо - минутных или часовых лимитов нет.\n\n## HTTP Таймаут\n\nПо-умолчанию таймаут равен 120 секунд, но его можно менять через переменную\nокружения `MOYSKLAD_HTTP_TIMEOUT`\n\n## Ссылочки\n\n* Картапамяти по API http://www.mindmeister.com/246618635/online-moysklad-ru\n* Документация для разработчииков https://support.moysklad.ru/hc/ru/sections/200561443-Разработчикам\n* Неплохая схема API в json https://gist.github.com/dapi/22a0790db19a4ff51a37\n\n## Другие биллиотеки\n\n* PHP https://github.com/Tooyz/moysklad\n* JavaScript/nodejs https://github.com/wmakeev/moysklad-client\n\n## Присылайте пул-реквесты )\n\n## Авторство\n\n* Данил Письменный (brandymint.ru)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdapi%2Fmoysklad","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdapi%2Fmoysklad","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdapi%2Fmoysklad/lists"}