Sha256: 974603bf8c9b6caadfc7e1571ac9eca62facf7a31352716c33469c7931b39273
Contents?: true
Size: 1.61 KB
Versions: 1
Compression:
Stored size: 1.61 KB
Contents
# http://www.bgc.se/upload/Gemensamt/Trycksaker/Manualer/BG6070.pdf section 5.2 module BankTools module SE class OCR class InvalidOCR < StandardError; end class OverlongOCR < InvalidOCR; end class BadChecksum < InvalidOCR; end class MustBeNumeric < InvalidOCR; end MIN_LENGTH = 2 MAX_LENGTH = 25 def self.from_number(number, opts = {}) number = number.to_s add_length_digit = opts.fetch(:length_digit, false) pad = opts.fetch(:pad, "").to_s raise MustBeNumeric unless number.match(/\A\d+\z/) # Padding isn't something BGC specifies, but we needed it to support a legacy scheme. number += pad # Adding 2: 1 length digit, 1 check digit. number += ((number.length + 2) % 10).to_s if add_length_digit number_with_ocr = number + Utils.luhn_checksum(number).to_s length = number_with_ocr.length if length > MAX_LENGTH raise OverlongOCR, "Bankgiro OCR must be #{MIN_LENGTH} - #{MAX_LENGTH} characters (this one would be #{length} characters)" end number_with_ocr end def self.to_number(number, opts = {}) number = number.to_s strip_length_digit = opts.fetch(:length_digit, false) strip_padding = opts.fetch(:pad, "").to_s raise MustBeNumeric unless number.match(/\A\d+\z/) raise BadChecksum unless Utils.valid_luhn?(number) digits_to_chop = 1 # Checksum. digits_to_chop += 1 if strip_length_digit digits_to_chop += strip_padding.length number[0...-digits_to_chop] end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
banktools-se-1.0.0 | lib/banktools-se/ocr.rb |