girocode 0.2.0 → 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 +4 -4
- data/CHANGELOG.md +4 -2
- data/README.md +11 -11
- data/lib/girocode/bic.rb +67 -0
- data/lib/girocode/code.rb +23 -23
- data/lib/girocode/version.rb +1 -1
- data/lib/girocode.rb +2 -1
- metadata +19 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae1af8187bb62eb64c3b96a6d9001899e7f156bba781844f1d3f462bf954a248
|
4
|
+
data.tar.gz: bd8ca3c9fd7156c50d801368f91986c8ea63bbb7e6934d6b356bb0a91a8df7db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2271e8db17f381aa6debff46557c81b08c3bf23bc74043a27fd61957f91f22d13fd6e6ba8791534d5a6f1df8e4eac85557befd4ec1ca4bc41ba9c3f799d1b6af
|
7
|
+
data.tar.gz: 8ac181062def7582a6fd8bc5604983a8ec8f95144cc276398f9f4df3d4ca2334b0c1a0101ff28d75d0de1655d661181cc0e908c44e8064bca27dc410a3524515
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -33,17 +33,17 @@ puts code.to_ansi
|
|
33
33
|
|
34
34
|
Codes can be generated with the following attributes:
|
35
35
|
|
36
|
-
| Attribute | Description | required | max size |
|
37
|
-
|
38
|
-
| `bic` | Bank Identifier Code | | 11 |
|
39
|
-
| `name` | Name of beneficiary | ✓ | 70 |
|
40
|
-
| `iban` | IBAN | ✓ | 34 |
|
41
|
-
| `currency` | ISO-4217 currency code | if `amount` given | 3 |
|
42
|
-
| `amount` | Money amount | | 12 |
|
43
|
-
| `purpose` | SEPA purpose code | | 4 |
|
44
|
-
| `creditor_reference` | ISO-11649 creditor reference | | 35 |
|
45
|
-
| `reference` | Unstructured reference | | 140 |
|
46
|
-
| `bto_info` | Beneficiary to originator info | | 70 |
|
36
|
+
| Attribute | Description | required | exclusive | max size |
|
37
|
+
|----------------------|--------------------------------|--------------------|-----------|----------|
|
38
|
+
| `bic` | Bank Identifier Code | | | 11 |
|
39
|
+
| `name` | Name of beneficiary | ✓ | | 70 |
|
40
|
+
| `iban` | IBAN | ✓ | | 34 |
|
41
|
+
| `currency` | ISO-4217 currency code | if `amount` given | | 3 |
|
42
|
+
| `amount` | Money amount | | | 12 |
|
43
|
+
| `purpose` | SEPA purpose code | | | 4 |
|
44
|
+
| `creditor_reference` | ISO-11649 creditor reference | | ✓ | 35 |
|
45
|
+
| `reference` | Unstructured reference | | ✓ | 140 |
|
46
|
+
| `bto_info` | Beneficiary to originator info | | | 70 |
|
47
47
|
|
48
48
|
## Limitations
|
49
49
|
|
data/lib/girocode/bic.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# derived from bank-contact/bic by Kevin
|
2
|
+
|
3
|
+
module Girocode
|
4
|
+
class BIC
|
5
|
+
REGEX = /\A([A-Z]{4})([A-Z]{2})([A-Z0-9]{2})([A-Z0-9]{3})?\z/.freeze
|
6
|
+
|
7
|
+
def self.valid?(code)
|
8
|
+
new(code).valid?
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(code)
|
12
|
+
@code = code.to_s.gsub(/\s+/, '').upcase
|
13
|
+
end
|
14
|
+
|
15
|
+
def bank_code
|
16
|
+
@code[0..3]
|
17
|
+
end
|
18
|
+
|
19
|
+
def country_code
|
20
|
+
@code[4..5]
|
21
|
+
end
|
22
|
+
|
23
|
+
def location_code
|
24
|
+
@code[6..7]
|
25
|
+
end
|
26
|
+
|
27
|
+
def branch_code
|
28
|
+
@code[8..10]
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_s(formatted = false)
|
32
|
+
formatted ? to_formatted_str : @code
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_formatted_str
|
36
|
+
"#{bank_code} #{country_code} #{location_code} #{branch_code}".strip
|
37
|
+
end
|
38
|
+
|
39
|
+
def test?
|
40
|
+
location_code[1] == '0'
|
41
|
+
end
|
42
|
+
|
43
|
+
def passive?
|
44
|
+
location_code[1] == '1'
|
45
|
+
end
|
46
|
+
|
47
|
+
def reverse_billing?
|
48
|
+
location_code[1] == '2'
|
49
|
+
end
|
50
|
+
|
51
|
+
def valid?
|
52
|
+
valid_format? && valid_location_code? && valid_branch_code?
|
53
|
+
end
|
54
|
+
|
55
|
+
def valid_format?
|
56
|
+
REGEX.match?(@code)
|
57
|
+
end
|
58
|
+
|
59
|
+
def valid_location_code?
|
60
|
+
!location_code.start_with?('0', '1') && !location_code.end_with?('O')
|
61
|
+
end
|
62
|
+
|
63
|
+
def valid_branch_code?
|
64
|
+
branch_code.empty? || branch_code == 'XXX' || !branch_code.start_with?('X')
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/lib/girocode/code.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
module Girocode
|
2
2
|
class Error < StandardError; end
|
3
|
-
|
3
|
+
|
4
4
|
class Code
|
5
5
|
ATTRIBUTES = %i[bic name iban currency amount purpose creditor_reference reference bto_info]
|
6
6
|
attr_reader *ATTRIBUTES
|
7
|
-
|
7
|
+
|
8
8
|
MAX_PAYLOAD_BYTES = 331
|
9
9
|
AMOUNT_RANGE = BigDecimal('0.01')..BigDecimal('999999999.99')
|
10
|
-
|
10
|
+
|
11
11
|
def initialize(**attrs)
|
12
12
|
if keys = attrs.keys - ATTRIBUTES and not keys.empty?
|
13
13
|
raise ArgumentError, "Illegal attributes #{keys.inspect}"
|
@@ -19,17 +19,17 @@ module Girocode
|
|
19
19
|
raise ArgumentError, "either creditor reference or reference may be set" if creditor_reference? && reference?
|
20
20
|
raise ArgumentError, "payload too long" if payload.bytesize > MAX_PAYLOAD_BYTES
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def bic=(value)
|
24
24
|
if value.nil?
|
25
25
|
@bic = nil
|
26
26
|
else
|
27
|
-
bic =
|
27
|
+
bic = BIC.new(value)
|
28
28
|
raise ArgumentError, "Invalid BIC #{value.inspect}" unless bic.valid?
|
29
29
|
@bic = bic.to_s
|
30
30
|
end
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
def name=(value)
|
34
34
|
value = value.strip
|
35
35
|
raise ArgumentError, 'name is required' unless value
|
@@ -37,81 +37,81 @@ module Girocode
|
|
37
37
|
raise ArgumentError, 'Illegal name' if value.include?("\n") || value.include?("\r")
|
38
38
|
@name = value
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
def iban=(value)
|
42
|
-
|
43
|
-
|
44
|
-
@iban =
|
42
|
+
raise ArgumentError, "Invalid IBAN #{value.inspect}" unless IBANTools::IBAN.valid?(value)
|
43
|
+
|
44
|
+
@iban = value
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
def currency=(value)
|
48
48
|
value = value.to_s.upcase
|
49
49
|
raise ArgumentError, "Invalid currency" unless value.match?(/\A[A-Z]{3}\z/)
|
50
50
|
@currency = value
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
def amount=(value)
|
54
54
|
raise ArgumentError, 'amount is required' unless value
|
55
55
|
value = BigDecimal(value, Float::DIG + 1)
|
56
56
|
raise ArgumentError, "invalid amount #{value.inspect}" unless AMOUNT_RANGE.cover?(value)
|
57
57
|
@amount = value
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
def purpose=(value)
|
61
61
|
unless value.nil?
|
62
62
|
raise ArgumentError, "invalid purpose #{value.inspect}" unless value.match?(/\A[A-z0-9]{0,4}\z/)
|
63
63
|
end
|
64
64
|
@purpose = value
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
def creditor_reference=(value)
|
68
68
|
unless value.nil?
|
69
69
|
raise ArgumentError, "invalid creditor reference #{value.inspect}" if value.include?("\n") || value.include?("\r") || value.size > 35
|
70
70
|
end
|
71
71
|
@creditor_reference = value
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
def reference=(value)
|
75
75
|
unless value.nil?
|
76
76
|
raise ArgumentError, "invalid reference #{value.inspect}" if value.include?("\n") || value.include?("\r") || value.size > 140
|
77
77
|
end
|
78
78
|
@reference = value
|
79
79
|
end
|
80
|
-
|
80
|
+
|
81
81
|
def bto_info=(value)
|
82
82
|
unless value.nil?
|
83
83
|
raise ArgumentError, "invalid bto_info #{value.inspect}" if value.include?("\n") || value.include?("\r") || value.size > 70
|
84
84
|
end
|
85
85
|
@bto_info = value
|
86
86
|
end
|
87
|
-
|
87
|
+
|
88
88
|
ATTRIBUTES.each do |attr|
|
89
89
|
define_method("#{attr}?") do
|
90
90
|
value = instance_variable_get("@#{attr}")
|
91
91
|
value.respond_to?(:empty?) ? !value.empty? : !!value
|
92
92
|
end
|
93
93
|
end
|
94
|
-
|
94
|
+
|
95
95
|
def payload
|
96
96
|
['BCD', '002', '1', 'SCT',
|
97
97
|
bic, name, iban,formatted_amount, purpose,
|
98
98
|
creditor_reference || reference, bto_info].map(&:to_s).join("\n")
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
def to_qrcode
|
102
102
|
RQRCode::QRCode.new(payload, level: :m, mode: :byte_8bit)
|
103
103
|
end
|
104
|
-
|
104
|
+
|
105
105
|
def to_ascii
|
106
106
|
to_qrcode.to_s
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
%i[png svg html ansi].each do |format|
|
110
110
|
define_method("to_#{format}") { |*args| to_qrcode.public_send("as_#{format}", *args) }
|
111
111
|
end
|
112
|
-
|
112
|
+
|
113
113
|
private
|
114
|
-
|
114
|
+
|
115
115
|
def formatted_amount
|
116
116
|
"#{currency}#{amount.round(2).to_s('F')}" if currency? && amount
|
117
117
|
end
|
data/lib/girocode/version.rb
CHANGED
data/lib/girocode.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,28 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: girocode
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthias Grosser
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
12
|
+
- !ruby/object:Gem::Dependency
|
13
|
+
name: bigdecimal
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ">="
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '0'
|
19
|
+
type: :runtime
|
20
|
+
prerelease: false
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
requirements:
|
23
|
+
- - ">="
|
24
|
+
- !ruby/object:Gem::Version
|
25
|
+
version: '0'
|
13
26
|
- !ruby/object:Gem::Dependency
|
14
27
|
name: rqrcode
|
15
28
|
requirement: !ruby/object:Gem::Requirement
|
@@ -25,7 +38,7 @@ dependencies:
|
|
25
38
|
- !ruby/object:Gem::Version
|
26
39
|
version: '0'
|
27
40
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
41
|
+
name: iban-tools
|
29
42
|
requirement: !ruby/object:Gem::Requirement
|
30
43
|
requirements:
|
31
44
|
- - ">="
|
@@ -49,13 +62,13 @@ files:
|
|
49
62
|
- LICENSE
|
50
63
|
- README.md
|
51
64
|
- lib/girocode.rb
|
65
|
+
- lib/girocode/bic.rb
|
52
66
|
- lib/girocode/code.rb
|
53
67
|
- lib/girocode/version.rb
|
54
68
|
homepage: https://github.com/mtgrosser/girocode
|
55
69
|
licenses:
|
56
70
|
- MIT
|
57
71
|
metadata: {}
|
58
|
-
post_install_message:
|
59
72
|
rdoc_options: []
|
60
73
|
require_paths:
|
61
74
|
- lib
|
@@ -70,8 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
70
83
|
- !ruby/object:Gem::Version
|
71
84
|
version: '0'
|
72
85
|
requirements: []
|
73
|
-
rubygems_version: 3.
|
74
|
-
signing_key:
|
86
|
+
rubygems_version: 3.6.7
|
75
87
|
specification_version: 4
|
76
88
|
summary: Generate QR codes for SEPA credit transfers
|
77
89
|
test_files: []
|