orangedata 0.0.10 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +4 -4
- data/README.md +6 -6
- data/lib/orange_data/credentials.rb +19 -38
- data/lib/orange_data/schema_definitions.yml +12 -7
- data/lib/orange_data/version.rb +1 -1
- data/orangedata.gemspec +2 -2
- metadata +3 -8
- data/.gitignore +0 -11
- data/.rspec +0 -3
- data/.rubocop.yml +0 -105
- data/.travis.yml +0 -9
- data/tmp/.keep +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 24d97c1e067049b4e767c7ca1579e623fa68753c5f486299d1a507d4bc68d66b
|
4
|
+
data.tar.gz: a97d04fd012da815eaccc8ceffba7e437ab606b4b636aef0576cf2d98f18702b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 735c83060727e2985bf290924ffc03ef7f8455013aa7cc41d602a3c2fae6adc1e151e693ef5b72caa320947da3884cc6af0bf264915f3bdc5252203271464385
|
7
|
+
data.tar.gz: ed6c5f041c686f1acdb1f50f42b625ba6b0384123a0cc23e7681939c2694969091fbf019cb30cee24e999e77aa7e53da42175d27d66984b1873a0a43ada7aaeb
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.0.0
|
4
|
+
|
5
|
+
- breaking: drop support for EOL versions of ruby (< 2.7)
|
6
|
+
- possibly breaking: added vat20 to match current protocol
|
7
|
+
|
8
|
+
## 0.1.0
|
9
|
+
|
10
|
+
- Deprecated support for EOL ruby versions < 2.6 - gem may continue to work, but will not be tested against
|
11
|
+
- Switched CI to github actions
|
12
|
+
- ruby 3.0, 3.1 support
|
13
|
+
|
3
14
|
## 0.0.10
|
4
15
|
- Changed cashless print title per law change
|
5
16
|
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
orangedata (0.0
|
4
|
+
orangedata (1.0.0)
|
5
5
|
faraday (>= 0.15)
|
6
6
|
faraday_middleware
|
7
7
|
|
@@ -15,7 +15,7 @@ GEM
|
|
15
15
|
rexml
|
16
16
|
diff-lcs (1.5.0)
|
17
17
|
docile (1.4.0)
|
18
|
-
faraday (1.10.
|
18
|
+
faraday (1.10.3)
|
19
19
|
faraday-em_http (~> 1.0)
|
20
20
|
faraday-em_synchrony (~> 1.0)
|
21
21
|
faraday-excon (~> 1.1)
|
@@ -44,7 +44,7 @@ GEM
|
|
44
44
|
json (2.6.2)
|
45
45
|
json-schema (3.0.0)
|
46
46
|
addressable (>= 2.8)
|
47
|
-
multipart-post (2.
|
47
|
+
multipart-post (2.3.0)
|
48
48
|
parallel (1.22.1)
|
49
49
|
parser (3.1.2.1)
|
50
50
|
ast (~> 2.4.1)
|
@@ -108,4 +108,4 @@ DEPENDENCIES
|
|
108
108
|
webmock
|
109
109
|
|
110
110
|
BUNDLED WITH
|
111
|
-
|
111
|
+
2.3.10
|
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/orangedata.svg)](https://badge.fury.io/rb/orangedata)
|
4
4
|
![Gem downloads](https://img.shields.io/gem/dt/orangedata.svg)
|
5
|
-
|
5
|
+
![Build Status](https://github.com/Vasfed/orangedata/actions/workflows/test.yml/badge.svg?branch=master)
|
6
6
|
|
7
7
|
A ruby client for orangedata.ru service.
|
8
8
|
Target service is pretty local to RU, so parts of readme will be in russian.
|
@@ -35,9 +35,9 @@ gem 'orangedata'
|
|
35
35
|
|
36
36
|
### Пробитие чека
|
37
37
|
|
38
|
-
Описание полей смотреть в [официальной документации](https://github.com/orangedata-official/API), названия маппинга и некоторые
|
38
|
+
Описание полей смотреть в [официальной документации](https://github.com/orangedata-official/API), названия маппинга и некоторые комментарии есть [в схеме данных](lib/orange_data/schema_definitions.yml) (метасхема расширений [тут](spec/lib/extensions_metaschema.yml)).
|
39
39
|
|
40
|
-
Для `enum`-полей есть маппинг, например `content.positions[0].tax` принимает значения: `:
|
40
|
+
Для `enum`-полей есть маппинг, например `content.positions[0].tax` принимает значения: `:vat_20`, `:vat_10`, `:vat_20_120`, `:vat_10_110`, `:vat_0`, `:vat_not_charged`.
|
41
41
|
|
42
42
|
Простейший чек в тестовом окружении:
|
43
43
|
|
@@ -101,8 +101,8 @@ correction = OrangeData::Correction.income(inn:"123456789012", id:"12345678990")
|
|
101
101
|
sum_cash: 1.23, sum_card: 2.34,
|
102
102
|
sum_prepaid: 5.67, sum_credit: 4.56, sum_counterclaim: 3.45,
|
103
103
|
|
104
|
-
|
105
|
-
vat_not_charged: 4.34,
|
104
|
+
vat_20: 1.34, vat_10: 2.34, vat_0: 3.34,
|
105
|
+
vat_not_charged: 4.34, vat_20_120: 5.34, vat_10_110: 6.34,
|
106
106
|
taxation_system: :simplified,
|
107
107
|
|
108
108
|
automat_number: "123456789",
|
@@ -135,7 +135,7 @@ res = transport.get_correction(correction.inn, correction.id)
|
|
135
135
|
|
136
136
|
Если все прошло гладко - теперь у вас есть файлик `my_production.yml` со всеми реквизитами доступа к продакшн-кассе. Обращаться с ним стоит как и с любой другой очень чувствительной информацией, например не стоит коммитить его (ну или как минимум, убрать из него поля `signature_key_pass` и `certificate_key_pass` и хранить отдельно)
|
137
137
|
|
138
|
-
Дальше публичный ключ с предыдущего шага отправляется в ЛК, там его
|
138
|
+
Дальше публичный ключ с предыдущего шага отправляется в ЛК, там его сохраняем, "подключаем интеграцию", и пользуемся:
|
139
139
|
|
140
140
|
```ruby
|
141
141
|
transport = OrangeData::Transport.new(OrangeData::Transport::DEFAULT_PRODUCTION_API_URL, OrangeData::Credentials.from_hash(YAML.load_file('my_production.yml')))
|
@@ -50,41 +50,22 @@ module OrangeData
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def from_hash(hash)
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
# a bit ugly - simulating with_indifferent_access
|
57
|
-
if hash['n'] || hash[:n]
|
58
|
-
# public key only has n and e (without them - there's no key actually)
|
59
|
-
key.set_key(
|
60
|
-
OpenSSL::BN.new(Base64.decode64(hash['n'] || hash[:n]), 2),
|
61
|
-
OpenSSL::BN.new(Base64.decode64(hash['e'] || hash[:e]), 2),
|
62
|
-
(hash['d'] || hash[:d]) && OpenSSL::BN.new(Base64.decode64(hash['d'] || hash[:d]), 2)
|
63
|
-
)
|
64
|
-
end
|
65
|
-
|
66
|
-
if hash['p'] || hash[:p]
|
67
|
-
key.set_factors(
|
68
|
-
OpenSSL::BN.new(Base64.decode64(hash['p'] || hash[:p]), 2),
|
69
|
-
OpenSSL::BN.new(Base64.decode64(hash['q'] || hash[:q]), 2)
|
70
|
-
)
|
71
|
-
if hash['dmp1'] || hash[:dmp1]
|
72
|
-
key.set_crt_params(
|
73
|
-
OpenSSL::BN.new(Base64.decode64(hash['dmp1'] || hash[:dmp1]), 2),
|
74
|
-
OpenSSL::BN.new(Base64.decode64(hash['dmq1'] || hash[:dmq1]), 2),
|
75
|
-
OpenSSL::BN.new(Base64.decode64(hash['iqmp'] || hash[:iqmp]), 2)
|
76
|
-
)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
else
|
80
|
-
# ruby 2.3 and may be older
|
81
|
-
key.params.each_key do |param|
|
82
|
-
if (v = hash[param] || hash[param.to_sym])
|
83
|
-
key.send(:"#{param}=", OpenSSL::BN.new(Base64.decode64(v), 2))
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
53
|
+
factors = %i[n e d p q dmp1 dmq1 iqmp] # order is important
|
54
|
+
hash = hash.transform_keys(&:to_sym).slice(*factors).compact.transform_values do |value|
|
55
|
+
OpenSSL::ASN1::Integer(OpenSSL::BN.new(Base64.decode64(value), 2))
|
87
56
|
end
|
57
|
+
|
58
|
+
raise 'Need at least n and e key params' unless hash.key?(:n) && hash.key?(:e)
|
59
|
+
|
60
|
+
data_sequence = if hash.keys == factors
|
61
|
+
# all factors present => have private key
|
62
|
+
OpenSSL::ASN1::Sequence([OpenSSL::ASN1::Integer(0)] + hash.values)
|
63
|
+
else
|
64
|
+
# only public key
|
65
|
+
OpenSSL::ASN1::Sequence(hash.slice(:n, :e).values)
|
66
|
+
end
|
67
|
+
|
68
|
+
OpenSSL::PKey::RSA.new(OpenSSL::ASN1::Sequence(data_sequence).to_der)
|
88
69
|
end
|
89
70
|
|
90
71
|
def load_from(val, key_pass=nil)
|
@@ -241,14 +222,14 @@ module OrangeData
|
|
241
222
|
end
|
242
223
|
end
|
243
224
|
|
244
|
-
from_hash(
|
225
|
+
from_hash({
|
245
226
|
title: title || "Generated from #{File.basename(path)}",
|
246
227
|
signature_key_name: signature_key_name || File.basename(client_cert).gsub(/\..*/, ''),
|
247
228
|
certificate: File.read(client_cert),
|
248
229
|
certificate_key: File.read(client_cert.sub(/.crt\z/, '.key')),
|
249
230
|
certificate_key_pass: cert_key_pass,
|
250
231
|
signature_key: signature_key
|
251
|
-
)
|
232
|
+
})
|
252
233
|
end
|
253
234
|
|
254
235
|
def self.read_certs_from_zip_pack(rubyzip_object, signature_key_name:nil, cert_key_pass:nil, title:nil, signature_key:nil)
|
@@ -269,14 +250,14 @@ module OrangeData
|
|
269
250
|
end
|
270
251
|
end
|
271
252
|
|
272
|
-
from_hash(
|
253
|
+
from_hash({
|
273
254
|
title: title || "Generated from zip",
|
274
255
|
signature_key_name: signature_key_name || File.basename(client_cert.name).gsub(/\..*/, ''),
|
275
256
|
certificate: client_cert.get_input_stream.read,
|
276
257
|
certificate_key: client_key.get_input_stream.read,
|
277
258
|
certificate_key_pass: cert_key_pass,
|
278
259
|
signature_key: signature_key
|
279
|
-
)
|
260
|
+
})
|
280
261
|
end
|
281
262
|
|
282
263
|
# публичная часть ключа подписи в формате пригодном для отдачи в ЛК
|
@@ -273,13 +273,19 @@ definitions:
|
|
273
273
|
x-enum:
|
274
274
|
vat_18:
|
275
275
|
val: 1
|
276
|
-
title: ставка НДС 18%
|
276
|
+
title: ставка НДС 18% (старая, теперь 20)
|
277
|
+
vat_20:
|
278
|
+
val: 1
|
279
|
+
title: ставка НДС 20%
|
277
280
|
vat_10:
|
278
281
|
val: 2
|
279
282
|
title: ставка НДС 10%
|
280
283
|
vat_18_118:
|
281
284
|
val: 3
|
282
|
-
title: ставка НДС расч. 18/118
|
285
|
+
title: ставка НДС расч. 18/118 (старая)
|
286
|
+
vat_20_120:
|
287
|
+
val: 3
|
288
|
+
title: ставка НДС расч. 20/120
|
283
289
|
vat_10_110:
|
284
290
|
val: 4
|
285
291
|
title: ставка НДС расч. 10/110
|
@@ -742,10 +748,10 @@ definitions:
|
|
742
748
|
type: number
|
743
749
|
|
744
750
|
tax1Sum:
|
745
|
-
title: Сумма НДС чека по ставке
|
751
|
+
title: Сумма НДС чека по ставке 20%
|
746
752
|
x-comment: осторожно, номера в названии поля не соответствуют значениям в CheckPosition.tax
|
747
753
|
x-tag-id: 1102
|
748
|
-
x-alias:
|
754
|
+
x-alias: vat_20
|
749
755
|
type: number
|
750
756
|
format: double
|
751
757
|
tax2Sum:
|
@@ -768,9 +774,9 @@ definitions:
|
|
768
774
|
type: number
|
769
775
|
tax5Sum:
|
770
776
|
format: double
|
771
|
-
title: Сумма НДС чека по расч. ставке
|
777
|
+
title: Сумма НДС чека по расч. ставке 20/120
|
772
778
|
x-tag-id: 1106
|
773
|
-
x-alias:
|
779
|
+
x-alias: vat_20_120
|
774
780
|
type: number
|
775
781
|
tax6Sum:
|
776
782
|
format: double
|
@@ -949,4 +955,3 @@ definitions:
|
|
949
955
|
description: URL для отправки результатов обработки чека POST запросом
|
950
956
|
type: [string, "null"]
|
951
957
|
maxLength: 1024
|
952
|
-
|
data/lib/orange_data/version.rb
CHANGED
data/orangedata.gemspec
CHANGED
@@ -16,14 +16,14 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.license = "MIT"
|
17
17
|
|
18
18
|
spec.files = Dir.chdir(File.expand_path('.', __dir__)) do
|
19
|
-
`git ls-files -z`.split("\x0").reject{|f| f.match(%r{^(test|spec|features)/}) }
|
19
|
+
`git ls-files -z`.split("\x0").reject{|f| f.start_with?('.') || f.match(%r{^(test|spec|features|tmp)/}) }
|
20
20
|
end
|
21
21
|
|
22
22
|
# spec.bindir = "exe"
|
23
23
|
# spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
24
|
spec.require_paths = ["lib"]
|
25
25
|
|
26
|
-
# spec.required_ruby_version = ">=2.
|
26
|
+
# spec.required_ruby_version = ">=2.6"
|
27
27
|
|
28
28
|
spec.add_dependency "faraday", ">=0.15"
|
29
29
|
spec.add_dependency "faraday_middleware"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: orangedata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vasily Fedoseyev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-03-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -157,10 +157,6 @@ executables: []
|
|
157
157
|
extensions: []
|
158
158
|
extra_rdoc_files: []
|
159
159
|
files:
|
160
|
-
- ".gitignore"
|
161
|
-
- ".rspec"
|
162
|
-
- ".rubocop.yml"
|
163
|
-
- ".travis.yml"
|
164
160
|
- CHANGELOG.md
|
165
161
|
- Gemfile
|
166
162
|
- Gemfile.lock
|
@@ -179,7 +175,6 @@ files:
|
|
179
175
|
- lib/orange_data/version.rb
|
180
176
|
- lib/orangedata.rb
|
181
177
|
- orangedata.gemspec
|
182
|
-
- tmp/.keep
|
183
178
|
homepage: https://github.com/Vasfed/orangedata
|
184
179
|
licenses:
|
185
180
|
- MIT
|
@@ -199,7 +194,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
199
194
|
- !ruby/object:Gem::Version
|
200
195
|
version: '0'
|
201
196
|
requirements: []
|
202
|
-
rubygems_version: 3.1
|
197
|
+
rubygems_version: 3.4.1
|
203
198
|
signing_key:
|
204
199
|
specification_version: 4
|
205
200
|
summary: Ruby client for orangedata.ru service
|
data/.gitignore
DELETED
data/.rspec
DELETED
data/.rubocop.yml
DELETED
@@ -1,105 +0,0 @@
|
|
1
|
-
AllCops:
|
2
|
-
NewCops: enable
|
3
|
-
SuggestExtensions: false
|
4
|
-
# DefaultFormatter: fuubar
|
5
|
-
# TargetRubyVersion: 2.1
|
6
|
-
TargetRubyVersion: 2.3
|
7
|
-
Exclude:
|
8
|
-
- 'spec/fixtures/**/*'
|
9
|
-
- 'tmp/**/*'
|
10
|
-
|
11
|
-
Gemspec/RequiredRubyVersion: { Enabled: false }
|
12
|
-
|
13
|
-
Metrics/LineLength:
|
14
|
-
Max: 130
|
15
|
-
Exclude:
|
16
|
-
- 'spec/**/*'
|
17
|
-
|
18
|
-
Metrics/BlockLength:
|
19
|
-
Enabled: false
|
20
|
-
Exclude:
|
21
|
-
- 'spec/**/*'
|
22
|
-
|
23
|
-
Metrics/BlockNesting:
|
24
|
-
Max: 4
|
25
|
-
|
26
|
-
Metrics/MethodLength:
|
27
|
-
Max: 20
|
28
|
-
Enabled: false
|
29
|
-
|
30
|
-
Metrics/ClassLength: { Enabled: false }
|
31
|
-
|
32
|
-
Metrics/AbcSize:
|
33
|
-
# Max: 50
|
34
|
-
Enabled: false
|
35
|
-
|
36
|
-
Metrics/CyclomaticComplexity:
|
37
|
-
Max: 50
|
38
|
-
|
39
|
-
Metrics/PerceivedComplexity:
|
40
|
-
Max: 50
|
41
|
-
|
42
|
-
Metrics/ParameterLists:
|
43
|
-
Max: 10
|
44
|
-
|
45
|
-
Style/StringLiterals:
|
46
|
-
Enabled: false
|
47
|
-
# EnforcedStyle: double_quotes
|
48
|
-
|
49
|
-
Style/RedundantReturn: { Enabled: false }
|
50
|
-
|
51
|
-
Layout/ArgumentAlignment:
|
52
|
-
EnforcedStyle: with_fixed_indentation
|
53
|
-
|
54
|
-
Layout/SpaceBeforeBlockBraces:
|
55
|
-
EnforcedStyle: no_space
|
56
|
-
|
57
|
-
Layout/SpaceAroundEqualsInParameterDefault:
|
58
|
-
EnforcedStyle: no_space
|
59
|
-
|
60
|
-
Layout/SpaceAfterColon: { Enabled: false }
|
61
|
-
Layout/SpaceAroundOperators: { Enabled: false }
|
62
|
-
|
63
|
-
Layout/EndAlignment:
|
64
|
-
EnforcedStyleAlignWith: variable
|
65
|
-
|
66
|
-
Layout/SpaceInsideBlockBraces:
|
67
|
-
SpaceBeforeBlockParameters: false
|
68
|
-
|
69
|
-
Layout/EmptyLinesAroundBlockBody:
|
70
|
-
Exclude:
|
71
|
-
- 'spec/**/*'
|
72
|
-
|
73
|
-
Layout/EmptyLinesAroundModuleBody:
|
74
|
-
Enabled: false
|
75
|
-
# EnforcedStyle: empty_lines_except_namespace
|
76
|
-
Layout/EmptyLinesAroundClassBody:
|
77
|
-
Enabled: false
|
78
|
-
# EnforcedStyle: empty_lines_except_namespace
|
79
|
-
|
80
|
-
Layout/DotPosition:
|
81
|
-
# so that code can be copied to console
|
82
|
-
EnforcedStyle: trailing
|
83
|
-
|
84
|
-
Layout/FirstHashElementIndentation:
|
85
|
-
EnforcedStyle: consistent
|
86
|
-
|
87
|
-
Layout/EmptyLines: { Enabled: false }
|
88
|
-
Style/AsciiComments: { Enabled: false }
|
89
|
-
|
90
|
-
Style/Documentation:
|
91
|
-
# TODO
|
92
|
-
Enabled: false
|
93
|
-
|
94
|
-
Style/BlockDelimiters:
|
95
|
-
Enabled: false
|
96
|
-
Exclude:
|
97
|
-
- 'spec/**/*'
|
98
|
-
|
99
|
-
# trailing commas make simpler diffs
|
100
|
-
Style/TrailingCommaInHashLiteral: { Enabled: false }
|
101
|
-
Style/TrailingCommaInArrayLiteral: { Enabled: false }
|
102
|
-
Style/KeywordParametersOrder: { Enabled: false }
|
103
|
-
|
104
|
-
Naming/AccessorMethodName: { Enabled: false }
|
105
|
-
Naming/VariableNumber: { Enabled: false }
|
data/.travis.yml
DELETED
data/tmp/.keep
DELETED
File without changes
|