{"id":15465751,"url":"https://github.com/vasfed/orangedata","last_synced_at":"2025-07-16T01:20:11.303Z","repository":{"id":33177977,"uuid":"154174924","full_name":"Vasfed/orangedata","owner":"Vasfed","description":"Ruby client for orangedata.ru API, includes certificate generation","archived":false,"fork":false,"pushed_at":"2024-10-28T18:27:36.000Z","size":134,"stargazers_count":6,"open_issues_count":1,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-13T09:55:44.726Z","etag":null,"topics":["api","client","orangedata","ruby"],"latest_commit_sha":null,"homepage":"","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/Vasfed.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,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-10-22T16:12:05.000Z","updated_at":"2024-05-17T08:47:05.000Z","dependencies_parsed_at":"2024-11-08T17:00:34.776Z","dependency_job_id":"ab483380-b746-48c5-be13-8f1f30951c4e","html_url":"https://github.com/Vasfed/orangedata","commit_stats":{"total_commits":92,"total_committers":4,"mean_commits":23.0,"dds":0.07608695652173914,"last_synced_commit":"bcc94aa4e0145698781e5fe96031ec485a9f6c0b"},"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vasfed%2Forangedata","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vasfed%2Forangedata/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vasfed%2Forangedata/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Vasfed%2Forangedata/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Vasfed","download_url":"https://codeload.github.com/Vasfed/orangedata/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250221285,"owners_count":21394680,"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":["api","client","orangedata","ruby"],"created_at":"2024-10-02T01:03:17.227Z","updated_at":"2025-04-22T10:19:46.668Z","avatar_url":"https://github.com/Vasfed.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Orangedata Client\n\n[![Gem Version](https://badge.fury.io/rb/orangedata.svg)](https://badge.fury.io/rb/orangedata)\n![Gem downloads](https://img.shields.io/gem/dt/orangedata.svg)\n![Build Status](https://github.com/Vasfed/orangedata/actions/workflows/test.yml/badge.svg?branch=master)\n\nA ruby client for orangedata.ru service.\nTarget service is pretty local to RU, so parts of readme will be in russian.\n\nRuby-клиент для сервиса онлайн-касс OrangeData\n\nУмеет:\n- собственно транспорт с подписью запросов\n- сгенерировать ключ сразу в нужном виде\n- маппинг для данных генерируется на базе приведенного в человеческий вид официального json-schema-описания\n\nВ планах получше подружить с рельсами.\n\nНа всякий случай disclaimer: API еще не полностью устоялось и возможно будет обновляться по мере обкатки.\n\n## Установка\n\nВсе стандартно - `bundle add orangedata`, либо по-старике пишем в Gemfile:\n\n```ruby\ngem 'orangedata'\n```\n\nи давим `bundle`. Совсем руками можно `gem install orangedata`\n\n## Использование\n\nДля тестового окружения ключики в комплекте - [credentials_test.yml](lib/orange_data/credentials_test.yml), собрано из родного `File_for_test.zip`, доступны как `OrangeData::Credentials.default_test`.\nПолучение ключей для продакшна описано ниже.\n\n### Пробитие чека\n\nОписание полей смотреть в [официальной документации](https://github.com/orangedata-official/API), названия маппинга и некоторые комментарии есть [в схеме данных](lib/orange_data/schema_definitions.yml) (метасхема расширений [тут](spec/lib/extensions_metaschema.yml)).\n\nДля `enum`-полей есть маппинг, например `content.positions[0].tax` принимает значения: `:vat_20`, `:vat_10`, `:vat_20_120`, `:vat_10_110`, `:vat_0`, `:vat_not_charged`.\n\nПростейший чек в тестовом окружении:\n\n```ruby\n  transport = OrangeData::Transport.new(\"https://apip.orangedata.ru:2443/api/v2/\", OrangeData::Credentials.default_test)\n  receipt = OrangeData::Receipt.income(inn:\"1234567890\"){|r|\n    r.customer = \"Иван Иваныч\"\n    r.add_position(\"Спички\", price: 12.34){|pos| pos.tax = :vat_not_charged }\n    r.add_payment(50, :cash)\n  }\n  transport.post_document(receipt)\n  # wait some time\n  res = transport.get_document(receipt.inn, receipt.id)\n\n  # =\u003e (внутри такое, а вернет объект)\n  # {\n  # \"id\"=\u003e\"50152258-a9aa-4d19-9216-5a3eecec7241\",\n  # \"deviceSN\"=\u003e\"1400000000001033\",\n  # \"deviceRN\"=\u003e\"0000000400054952\",\n  # \"fsNumber\"=\u003e\"9999078900001341\",\n  # \"ofdName\"=\u003e\"ООО \\\"Ярус\\\" (\\\"ОФД-Я\\\")\",\n  # \"ofdWebsite\"=\u003e\"www.ofd-ya.ru\",\n  # \"ofdinn\"=\u003e\"7728699517\",\n  # \"fnsWebsite\"=\u003e\"www.nalog.ru\",\n  # \"companyINN\"=\u003e\"1234567890\",\n  # \"companyName\"=\u003e\"Тест\",\n  # \"documentNumber\"=\u003e3243,\n  # \"shiftNumber\"=\u003e234,\n  # \"documentIndex\"=\u003e7062, \"processedAt\"=\u003e\"2018-10-26T20:21:00\",\n  # \"content\"=\u003e{\n  #   \"type\"=\u003e1,\n  #   \"positions\"=\u003e[{\"price\"=\u003e12.34, \"tax\"=\u003e6, \"text\"=\u003e\"Спички\"}],\n  #   \"checkClose\"=\u003e{\"payments\"=\u003e[{\"type\"=\u003e1, \"amount\"=\u003e50.0}], \"taxationSystem\"=\u003e0},\n  #   \"customer\"=\u003e\"Иван Иваныч\"\n  # },\n  # \"change\"=\u003e37.66,\n  # \"fp\"=\u003e\"301645583\"\n  # }\n\n  res.device_sn\n  # =\u003e \"1400000000001033\"\n\n  # и даже так:\n  res.qr_code_content\n  # =\u003e \"t=20181026T2021\u0026s=50.0\u0026fn=9999078900001341\u0026i=3243\u0026fp=301645583\u0026n=1\"\n```\n\n### Чек коррекции\nОсторожно: в API не все значения поля `tax` соответствуют цифрам в `taxNSum`, поддержка OD ответила, что все ок, так и должно быть. Скорее всего непонятки с номерами налогов приехали еще из налоговой, т.к. номера тегов тут идут подряд.\n\nПоэтому в маппинге есть алиасы:\n\n```ruby\ntransport = OrangeData::Transport.new(\"https://apip.orangedata.ru:2443/api/v2/\", OrangeData::Credentials.default_test)\ncorrection = OrangeData::Correction.income(inn:\"123456789012\", id:\"12345678990\"){|c|\n  c.correction_type = :prescribed\n  c.assign_attributes(\n    description: \"НЕ ХОЧЕТСЯ НО НАДО\",\n    cause_document_date: \"2017-08-10T00:00:00\", cause_document_number: \"ФЗ-54\",\n    total_sum: 17.25,\n    sum_cash: 1.23, sum_card: 2.34,\n    sum_prepaid: 5.67, sum_credit: 4.56, sum_counterclaim: 3.45,\n\n    vat_20: 1.34, vat_10: 2.34, vat_0: 3.34,\n    vat_not_charged: 4.34, vat_20_120: 5.34, vat_10_110: 6.34,\n    taxation_system: :simplified,\n\n    automat_number: \"123456789\",\n    settlement_address: \"г.Москва, Красная площадь, д.1\",\n    settlement_place: \"Палата No6\",\n  )\n}\ntransport.post_correction(correction)\n# wait some time\nres = transport.get_correction(correction.inn, correction.id)\n```\n\n\n### Получаем сертификаты\n\nПредполагается, что всякие договоры и прочая фискализация уже успешно пройдена и у вас есть доступ\nк ЛК orangedata.\n\nВ [ЛК в разделе интеграций](https://lk.orangedata.ru/lk/integrations/direct) запрашиваем сертификат (шаг 3, первый шаг не нужен, а данные для второго получатся ниже), распаковываем полученный zip-архив и натравливаем туда генератор:\n\n```ruby\n  c = OrangeData::Credentials.read_certs_from_pack('~/Downloads/1234567890', title:'My production', cert_key_pass:'1234') # cert_key_pass берем из readme_v2.txt, но есть подозрение что он у всех 1234\n  File.open(\"my_production.yml\", \"wt\"){|f| f.write c.to_yaml }\n  c.signature_public_xml\n  # \"\u003cRSAKeyValue\u003e...\u003c/Exponent\u003e\u003c/RSAKeyValue\u003e\"\n\n  # опционально на маке копируем публичный ключ в буфер обмена:\n  system(\"echo '#{c.signature_public_xml}' | pbcopy\")\n```\n\nЕсли все прошло гладко - теперь у вас есть файлик `my_production.yml` со всеми реквизитами доступа к продакшн-кассе. Обращаться с ним стоит как и с любой другой очень чувствительной информацией, например не стоит коммитить его (ну или как минимум, убрать из него поля `signature_key_pass` и `certificate_key_pass` и хранить отдельно)\n\nДальше публичный ключ с предыдущего шага отправляется в ЛК, там его сохраняем, \"подключаем интеграцию\", и пользуемся:\n\n```ruby\n  transport = OrangeData::Transport.new(OrangeData::Transport::DEFAULT_PRODUCTION_API_URL, OrangeData::Credentials.from_hash(YAML.load_file('my_production.yml')))\n  transport.post_document # и далее по тексту, осторожно - не пробейте лишние чеки во время проверок\n```\n\nЕще есть `OrangeData::Credentials.read_certs_from_zip_pack`, куда можно скормить нераспакованный файлик, если у вас есть `gem 'rubyzip'`:\n\n```ruby\n  c = Zip::File.open(\"cert_123.zip\") do |zip_file|\n    OrangeData::Credentials.read_certs_from_zip_pack(zip_file, cert_key_pass:'1234')\n  end\n```\n\n## Разработка\n\nAfter checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.\n\nTo install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).\n\n## Contributing\n\nBug reports and pull requests are welcome on GitHub at https://github.com/Vasfed/orangedata.\n\n## License\n\nThe gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT). Copyright (c) 2018 Vasily Fedoseyev\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvasfed%2Forangedata","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvasfed%2Forangedata","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvasfed%2Forangedata/lists"}