banktools-se 0.4.0 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1b633dbca824e82f87a2231925c8d70eceefba6a
4
- data.tar.gz: 52d741928c20bdd104ef5485d63e98c2fc6a95a6
3
+ metadata.gz: 56a0412c8e17d142b99162549712b831e282fdd8
4
+ data.tar.gz: bc6dae711b9df4a89094eae81abf6f148a6092e1
5
5
  SHA512:
6
- metadata.gz: c5bb3d5baccd5d08d4c8a6151014d9790b507d87043061abc81f98036c932b84109cbdc8da1ee3d6fe30bb7a6f55ed9ef40fdea5673b3b4dd41ad43421551489
7
- data.tar.gz: 47f8212e2a74a177af8c4306a4369a54c677e1aaa9ae7a9dae13fa0aab63fe1292a1c5bdbe4c0d3270cec87a87b868519dfcfbae64c8b2fcfc72a47ed42520a3
6
+ metadata.gz: 08a10797c97ab40fae64930595cac729b92dea89762fec47fe90914f7d84735acad17e920322c09a783cafc89847c255ba462b222f24aebcc9aef8f33a5a5cd5
7
+ data.tar.gz: 27fa5ab9c2585e3a410333ac9722ab3bb1a2f235d285af2863d8495fc1b47710231c611972961572d178d5bafa69cae86d44682ec47669cd14e31ce8dff12289
data/README.markdown CHANGED
@@ -44,6 +44,13 @@ to install it.
44
44
  fundraising_account = BankTools::SE::Bankgiro.new("902-0033")
45
45
  fundraising_account.fundraising? # => true
46
46
 
47
+ # OCR
48
+ BankTools::SE::Bankgiro.number_to_ocr("123") # => "1230"
49
+ BankTools::SE::Bankgiro.number_to_ocr("123", length_digit: true) # => "12351"
50
+ BankTools::SE::Bankgiro.number_to_ocr("123", length_digit: true, pad: "0") # => "123067"
51
+ BankTools::SE::Bankgiro.number_from_ocr("1230") # => "123"
52
+ BankTools::SE::Bankgiro.number_from_ocr("123067", length_digit: true, pad: "0") # => "123"
53
+
47
54
 
48
55
  # Plusgiro
49
56
 
@@ -1,11 +1,46 @@
1
+ # http://sv.wikipedia.org/wiki/Bankgirot#Bankgironummer
2
+
1
3
  module BankTools
2
4
  module SE
3
5
  class Bankgiro
4
-
5
- # http://sv.wikipedia.org/wiki/Bankgirot#Bankgironummer
6
+ class OverlongOCR < StandardError; end
7
+ class BadCheckDigit < StandardError; end
6
8
 
7
9
  attr_reader :number
8
10
 
11
+ # http://www.bgc.se/upload/Gemensamt/Trycksaker/Manualer/BG6070.pdf section 5.2
12
+ def self.number_to_ocr(number, opts = {})
13
+ add_length_digit = opts.fetch(:length_digit, false)
14
+ pad = opts.fetch(:pad, nil)
15
+
16
+ number = number.to_s
17
+
18
+ if pad
19
+ number += pad
20
+ end
21
+
22
+ if add_length_digit
23
+ # Adding 2: 1 length digit, 1 check digit
24
+ number += ((number.length + 2) % 10).to_s
25
+ end
26
+
27
+ number_with_ocr = number.to_s + Utils.luhn_checksum(number).to_s
28
+ raise OverlongOCR, "Bankgiro OCR must be 2-25 characters" if number_with_ocr.length > 25
29
+ number_with_ocr
30
+ end
31
+
32
+ def self.number_from_ocr(number, opts = {})
33
+ strip_length_digit = opts.fetch(:length_digit, false)
34
+ strip_padding = opts.fetch(:pad, false)
35
+
36
+ raise BadCheckDigit unless Utils.valid_luhn?(number)
37
+
38
+ number = number.to_s
39
+ number.slice!(-2) if strip_length_digit
40
+ number.slice!(-strip_padding.length.succ..-2) if strip_padding
41
+ number.chop
42
+ end
43
+
9
44
  def initialize(number)
10
45
  @number = number
11
46
  end
@@ -13,6 +13,16 @@ module BankTools
13
13
  sum % 10 == 0
14
14
  end
15
15
 
16
+ def self.luhn_checksum(number)
17
+ digits = number.to_s.scan(/\d/).reverse.map { |x| x.to_i }
18
+ digits = digits.each_with_index.map { |d, i|
19
+ d *= 2 if i.even?
20
+ d > 9 ? d - 9 : d
21
+ }
22
+ sum = digits.inject(0) { |m, x| m + x }
23
+ mod = 10 - sum % 10
24
+ mod == 10 ? 0 : mod
25
+ end
16
26
  end
17
27
  end
18
28
  end
@@ -1,5 +1,5 @@
1
1
  module BankTools
2
2
  module SE
3
- VERSION = "0.4.0"
3
+ VERSION = "0.5.0"
4
4
  end
5
5
  end
@@ -83,4 +83,41 @@ describe BankTools::SE::Bankgiro do
83
83
  BankTools::SE::Bankgiro.new("5402-9681").should_not be_fundraising
84
84
  end
85
85
  end
86
+
87
+ # http://www.bgc.se/upload/Gemensamt/Trycksaker/Manualer/BG6070.pdf section 5.2
88
+ describe ".number_to_ocr" do
89
+ it "adds a mod-10 check digit" do
90
+ BankTools::SE::Bankgiro.number_to_ocr("123").should eq "1230"
91
+ end
92
+
93
+ it "can add an optional length digit" do
94
+ BankTools::SE::Bankgiro.number_to_ocr("1234567890", length_digit: true).should eq "123456789023"
95
+ end
96
+
97
+ it "can pad the number" do
98
+ BankTools::SE::Bankgiro.number_to_ocr("1234567890", length_digit: true, pad: "0").should eq "1234567890037"
99
+ end
100
+
101
+ it "raises if resulting number is > 25 digits" do
102
+ expect { BankTools::SE::Bankgiro.number_to_ocr("1234567890123456789012345") }.to raise_error(BankTools::SE::Bankgiro::OverlongOCR)
103
+ end
104
+ end
105
+
106
+ describe ".number_from_ocr" do
107
+ it "strips the mod-10 check digit" do
108
+ BankTools::SE::Bankgiro.number_from_ocr("1230").should eq "123"
109
+ end
110
+
111
+ it "can strip an optional length digit" do
112
+ BankTools::SE::Bankgiro.number_from_ocr("123456789023", length_digit: true).should eq "1234567890"
113
+ end
114
+
115
+ it "can pad the number" do
116
+ BankTools::SE::Bankgiro.number_from_ocr("1234567890037", length_digit: true, pad: "0").should eq "1234567890"
117
+ end
118
+
119
+ it "raises if check digit is wrong" do
120
+ expect { BankTools::SE::Bankgiro.number_from_ocr("1231") }.to raise_error(BankTools::SE::Bankgiro::BadCheckDigit)
121
+ end
122
+ end
86
123
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: banktools-se
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henrik Nyh
@@ -76,7 +76,6 @@ files:
76
76
  - .gitignore
77
77
  - .travis.yml
78
78
  - Gemfile
79
- - Guardfile
80
79
  - README.markdown
81
80
  - Rakefile
82
81
  - banktools-se.gemspec
data/Guardfile DELETED
@@ -1,6 +0,0 @@
1
- guard 'rspec', :version => 2, :cli => "--color" do
2
- watch(%r{^spec/.+_spec\.rb$})
3
- watch(%r{^lib/banktools-se/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
4
- watch(%r{^lib/(.+)\.rb$}) { |m| "spec" }
5
- watch('spec/spec_helper.rb') { "spec" }
6
- end