dockcheck 1.0.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.
- checksums.yaml +7 -0
- data/lib/dockcheck.rb +33 -0
- data/lib/dockcheck/inn.rb +51 -0
- data/lib/dockcheck/snils.rb +44 -0
- metadata +59 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: f87a0179e7d9a30eca6a5b2e58a928869bc8fd25b388ee00af1fb50b2dbc3cc7
|
|
4
|
+
data.tar.gz: 8f0258a734b2918ec9acaf50faf371c2c6b79911d46718619e0b00c504a390a0
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: a66a392e3167a048915e43b0acae510495029a4b544cdb7435b626ff46d16c8e2fc128616fc8730244ad8e3121659e252771252fea7ea8d93ecab1001714f61c
|
|
7
|
+
data.tar.gz: 7e85b1bb7a6e38fbd461be294ce9e2a5daa1d35c9d50efd05d3d43fab036f0d087eb6426af97cb6d352d43b4ec62a153914f9a60086e2c41f160ab7312545b62
|
data/lib/dockcheck.rb
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class DockCheck
|
|
4
|
+
@current_checker
|
|
5
|
+
|
|
6
|
+
def initialize(checker = :inn)
|
|
7
|
+
dispatch(checker)
|
|
8
|
+
self
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def check(numbers)
|
|
12
|
+
@current_checker.check(numbers)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def change_checker(checker)
|
|
16
|
+
dispatch(checker)
|
|
17
|
+
self
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
def dispatch(checker)
|
|
22
|
+
checkers_map = {inn: Inn, snils: Snils}
|
|
23
|
+
|
|
24
|
+
if checkers_map.key?(checker.to_sym)
|
|
25
|
+
@current_checker = checkers_map[checker].new
|
|
26
|
+
else
|
|
27
|
+
raise 'Incorrect checker!'
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
require 'dockcheck/inn'
|
|
33
|
+
require 'dockcheck/snils'
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class DockCheck::Inn
|
|
4
|
+
@@ten_digits_map = [2, 4, 10, 3, 5, 9, 4, 6, 8]
|
|
5
|
+
@@twelve_digits_first_map = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8]
|
|
6
|
+
@@twelve_digits_second_map = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8]
|
|
7
|
+
|
|
8
|
+
def check(numbers)
|
|
9
|
+
inn = prepare_inn(numbers)
|
|
10
|
+
case inn.count
|
|
11
|
+
when 10
|
|
12
|
+
ten_digit_inn_valid?(inn)
|
|
13
|
+
when 12
|
|
14
|
+
twelve_digit_inn_valid?(inn)
|
|
15
|
+
else
|
|
16
|
+
raise StandardError.new 'Incorrect inn numbers count!'
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
def prepare_inn(numbers)
|
|
22
|
+
numbers.split('').map { |n| n.to_i }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def control_sum_calc(inn, coefficients)
|
|
26
|
+
inn
|
|
27
|
+
.zip(coefficients)
|
|
28
|
+
.filter { |(a, b)| !b.nil? }
|
|
29
|
+
.reduce(0) { |acc, (a, b)| a * b + acc }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def sum_div(number)
|
|
33
|
+
number % 11 % 10
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def ten_digit_inn_valid?(inn)
|
|
37
|
+
last_number = inn.last
|
|
38
|
+
control_sum = control_sum_calc(inn, @@ten_digits_map)
|
|
39
|
+
last_number == sum_div(control_sum)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def twelve_digit_inn_valid?(inn)
|
|
43
|
+
last_number = inn.last
|
|
44
|
+
penult_number = inn.fetch(10)
|
|
45
|
+
|
|
46
|
+
first_sum = control_sum_calc(inn, @@twelve_digits_first_map)
|
|
47
|
+
second_sum = control_sum_calc(inn, @@twelve_digits_second_map)
|
|
48
|
+
|
|
49
|
+
penult_number == sum_div(first_sum) && last_number == sum_div(second_sum)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class DockCheck::Snils
|
|
4
|
+
@@coefficients_map = [9, 8, 7, 6, 5, 4, 3, 2, 1]
|
|
5
|
+
|
|
6
|
+
def check(numbers)
|
|
7
|
+
snils = prepare_snils(numbers)
|
|
8
|
+
case snils.count
|
|
9
|
+
when 11
|
|
10
|
+
last_digits = numbers.slice(9, 10).to_i
|
|
11
|
+
snils_valid?(snils, last_digits)
|
|
12
|
+
else
|
|
13
|
+
raise StandardError.new 'Incorrect snils numbers count!'
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
def prepare_snils(numbers)
|
|
19
|
+
numbers.split('').map { |n| n.to_i }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def control_sum_calc(inn, coefficients)
|
|
23
|
+
inn
|
|
24
|
+
.zip(coefficients)
|
|
25
|
+
.filter { |(a, b)| !b.nil? }
|
|
26
|
+
.reduce(0) { |acc, (a, b)| a * b + acc }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def check_control_sum(control_sum)
|
|
30
|
+
if control_sum < 100
|
|
31
|
+
control_sum
|
|
32
|
+
elsif control_sum == 100
|
|
33
|
+
0
|
|
34
|
+
else
|
|
35
|
+
rem = control_sum % 101
|
|
36
|
+
rem == 100 ? 0 : rem
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def snils_valid?(snils, last_digits)
|
|
41
|
+
control_sum = control_sum_calc(snils, @@coefficients_map)
|
|
42
|
+
last_digits == check_control_sum(control_sum)
|
|
43
|
+
end
|
|
44
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: dockcheck
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Artem Solomatin
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2021-06-14 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: rspec
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - ">="
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '0'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - ">="
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '0'
|
|
27
|
+
description: A simple document checksum validator
|
|
28
|
+
email: solar7455@gmail.com
|
|
29
|
+
executables: []
|
|
30
|
+
extensions: []
|
|
31
|
+
extra_rdoc_files: []
|
|
32
|
+
files:
|
|
33
|
+
- lib/dockcheck.rb
|
|
34
|
+
- lib/dockcheck/inn.rb
|
|
35
|
+
- lib/dockcheck/snils.rb
|
|
36
|
+
homepage: https://rubygems.org/gems/dockcheck
|
|
37
|
+
licenses:
|
|
38
|
+
- MIT
|
|
39
|
+
metadata: {}
|
|
40
|
+
post_install_message:
|
|
41
|
+
rdoc_options: []
|
|
42
|
+
require_paths:
|
|
43
|
+
- lib
|
|
44
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
45
|
+
requirements:
|
|
46
|
+
- - ">="
|
|
47
|
+
- !ruby/object:Gem::Version
|
|
48
|
+
version: 2.7.0
|
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - ">="
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '0'
|
|
54
|
+
requirements: []
|
|
55
|
+
rubygems_version: 3.1.6
|
|
56
|
+
signing_key:
|
|
57
|
+
specification_version: 4
|
|
58
|
+
summary: Document checksum validator.
|
|
59
|
+
test_files: []
|