sepa_clearer 0.0.2 → 0.5.1
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 +5 -5
- data/CHANGELOG.md +24 -0
- data/README.md +20 -7
- data/bin/update_data +2 -2
- data/data/deutsche_bundesbank.csv +4779 -48021
- data/data/deutsche_bundesbank.db +0 -0
- data/lib/sepa_clearer/clearer.rb +51 -5
- data/lib/sepa_clearer/deutsche_bundesbank.rb +12 -13
- data/lib/sepa_clearer/payment_provider.rb +38 -5
- data/lib/sepa_clearer/version.rb +1 -1
- data/sepa-clearer.gemspec +1 -0
- data/spec/clearer_spec.rb +6 -2
- data/spec/deutsche_bundesbank_spec.rb +9 -5
- data/spec/payment_provider_spec.rb +47 -3
- metadata +21 -8
Binary file
|
data/lib/sepa_clearer/clearer.rb
CHANGED
@@ -1,20 +1,66 @@
|
|
1
|
+
require 'sqlite3'
|
2
|
+
|
1
3
|
module SepaClearer
|
2
4
|
class Clearer
|
3
|
-
|
4
|
-
|
5
|
+
attr_accessor :db
|
6
|
+
|
7
|
+
# Make sure we always have the correct order of columns
|
8
|
+
ATTRIBUTES = [:name, :bic, :sct, :core, :cor1, :b2b]
|
9
|
+
|
10
|
+
def initialize(db_name = 'deutsche_bundesbank')
|
11
|
+
self.db = SQLite3::Database.new File.join(File.dirname(__FILE__), '../..', "data/#{db_name}.db")
|
12
|
+
end
|
13
|
+
|
14
|
+
def add(provider)
|
15
|
+
data = boolean_to_integers(provider.to_a)
|
16
|
+
db.execute "INSERT INTO payment_providers (#{ATTRIBUTES.join(',')}) VALUES (?, ?, ?, ?, ?, ?)", data
|
5
17
|
end
|
6
18
|
|
7
19
|
def all
|
8
|
-
|
20
|
+
db.execute("SELECT #{ATTRIBUTES.join(',')} FROM payment_providers ORDER BY name").map do |row|
|
21
|
+
PaymentProvider.new(hash_from_result(row))
|
22
|
+
end
|
9
23
|
end
|
10
24
|
|
11
25
|
def find_by_bic(bic)
|
12
|
-
|
13
|
-
|
26
|
+
db.execute("SELECT #{ATTRIBUTES.join(',')} FROM payment_providers WHERE bic = ?", normalize_bic(bic)).map do |row|
|
27
|
+
PaymentProvider.new(hash_from_result(row))
|
28
|
+
end.first
|
29
|
+
end
|
30
|
+
|
31
|
+
def delete
|
32
|
+
db.execute("DELETE FROM payment_providers").first
|
14
33
|
end
|
15
34
|
|
16
35
|
def normalize_bic(bic)
|
17
36
|
bic.to_s.ljust(11, 'X').upcase
|
18
37
|
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
|
41
|
+
def hash_from_result(raw_array)
|
42
|
+
raw_array_with_boolean = integers_to_boolean(raw_array)
|
43
|
+
Hash[ATTRIBUTES.zip(raw_array_with_boolean)]
|
44
|
+
end
|
45
|
+
|
46
|
+
def boolean_to_integers(array)
|
47
|
+
array.map do |element|
|
48
|
+
if element.kind_of?(TrueClass) || element.kind_of?(FalseClass)
|
49
|
+
element ? 1 : 0
|
50
|
+
else
|
51
|
+
element
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def integers_to_boolean(array)
|
57
|
+
array.map do |element|
|
58
|
+
if element.kind_of?(Integer)
|
59
|
+
element == 1
|
60
|
+
else
|
61
|
+
element
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
19
65
|
end
|
20
66
|
end
|
@@ -2,29 +2,28 @@ require 'csv'
|
|
2
2
|
|
3
3
|
module SepaClearer
|
4
4
|
class DeutscheBundesbank
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
MAPPING = {
|
6
|
+
service_sct: :sct,
|
7
|
+
service_sdd: :core,
|
8
|
+
service_cor1: :cor1,
|
9
|
+
service_b2b: :b2b
|
10
|
+
}
|
11
11
|
|
12
12
|
def data(file = nil)
|
13
13
|
@data ||= begin
|
14
14
|
[].tap do |data|
|
15
|
-
CSV.foreach(file || default_data_file, { headers: true, col_sep: ';', header_converters: :symbol }) do |row|
|
16
|
-
data.push PaymentProvider.new(
|
15
|
+
CSV.foreach(file || default_data_file, { headers: true, col_sep: ';', header_converters: :symbol, encoding: "iso-8859-1:UTF-8" }) do |row|
|
16
|
+
data.push PaymentProvider.new(parse_raw_data(row))
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
22
|
def parse_raw_data(data)
|
23
|
-
[
|
24
|
-
data[:name].strip.chomp,
|
25
|
-
data[:bic],
|
26
|
-
|
27
|
-
]
|
23
|
+
MAPPING.reduce({}) { |hsh,(key, service)| hsh[service] = (data[key] == '1'); hsh }.merge({
|
24
|
+
name: data[:name].strip.chomp,
|
25
|
+
bic: data[:bic].strip.chomp,
|
26
|
+
})
|
28
27
|
end
|
29
28
|
|
30
29
|
def default_data_file
|
@@ -2,12 +2,45 @@ module SepaClearer
|
|
2
2
|
class PaymentProvider
|
3
3
|
SERVICES = [:sct, :core, :cor1, :b2b]
|
4
4
|
|
5
|
-
attr_accessor :name, :bic, :
|
5
|
+
attr_accessor :name, :bic, :sct, :core, :cor1, :b2b
|
6
6
|
|
7
|
-
def initialize(
|
8
|
-
self.name = name
|
9
|
-
self.bic = bic
|
10
|
-
self.
|
7
|
+
def initialize(options = {})
|
8
|
+
self.name = options[:name]
|
9
|
+
self.bic = options[:bic]
|
10
|
+
self.sct = options[:sct] || false
|
11
|
+
self.core = options[:core] || false
|
12
|
+
self.cor1 = options[:cor1] || false
|
13
|
+
self.b2b = options[:b2b] || false
|
14
|
+
end
|
15
|
+
|
16
|
+
def capabilities
|
17
|
+
SERVICES.map { |s| [s, send(s)] }.select { |_,v| v }.map { |k,v| k }
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns a list of provided direct debit methods sorted by there speed
|
21
|
+
# :cor1 => 2 business days
|
22
|
+
# :core => 3 business days (recurring) & 6 business days for first
|
23
|
+
def direct_debit_instruments
|
24
|
+
(capabilities & [:core, :cor1]).sort
|
25
|
+
end
|
26
|
+
|
27
|
+
def bic
|
28
|
+
@bic.to_s.ljust(11, 'X').upcase
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_a
|
32
|
+
to_hash.values
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_hash
|
36
|
+
{
|
37
|
+
name: name,
|
38
|
+
bic: bic,
|
39
|
+
sct: sct,
|
40
|
+
core: core,
|
41
|
+
cor1: cor1,
|
42
|
+
b2b: b2b,
|
43
|
+
}
|
11
44
|
end
|
12
45
|
end
|
13
46
|
end
|
data/lib/sepa_clearer/version.rb
CHANGED
data/sepa-clearer.gemspec
CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
+
spec.add_dependency "sqlite3"
|
21
22
|
spec.add_development_dependency "bundler", "~> 1.6"
|
22
23
|
spec.add_development_dependency "rake", "~> 0"
|
23
24
|
spec.add_development_dependency "rspec", "~> 3"
|
data/spec/clearer_spec.rb
CHANGED
@@ -9,18 +9,22 @@ describe SepaClearer::Clearer do
|
|
9
9
|
|
10
10
|
describe '#find_by_bic' do
|
11
11
|
it 'returns the provider with the given BIC' do
|
12
|
-
expect(subject.find_by_bic('
|
12
|
+
expect(subject.find_by_bic('AABAFI22')).to be_kind_of(SepaClearer::PaymentProvider)
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'returns nil if no object matches the BIC' do
|
16
16
|
expect(subject.find_by_bic('MYTHINGY')).to eq(nil)
|
17
17
|
end
|
18
18
|
|
19
|
-
it 'normalizes
|
19
|
+
it 'normalizes the bic before searching' do
|
20
20
|
allow(subject).to receive(:normalize_bic).and_return('AAA')
|
21
21
|
expect(subject.find_by_bic('MYTHINGY')).to eq(nil)
|
22
22
|
expect(subject).to have_received(:normalize_bic)
|
23
23
|
end
|
24
|
+
|
25
|
+
it 'returns an initialize object' do
|
26
|
+
expect(subject.find_by_bic('AABAFI22').name).to eq('BANK OF ALAND PLC')
|
27
|
+
end
|
24
28
|
end
|
25
29
|
|
26
30
|
describe '#normalize_bic' do
|
@@ -3,20 +3,24 @@ require 'spec_helper'
|
|
3
3
|
describe SepaClearer::DeutscheBundesbank do
|
4
4
|
describe '#parse_raw_data' do
|
5
5
|
let(:data) { { name: "My Org \n", bic: 'QWERTZ12345', service_sct: '1' } }
|
6
|
-
|
7
|
-
|
6
|
+
|
7
|
+
it 'returns a hash' do
|
8
|
+
expect(subject.parse_raw_data(data)).to be_kind_of(Hash)
|
8
9
|
end
|
9
10
|
|
10
11
|
it 'cleans up the name' do
|
11
|
-
expect(subject.parse_raw_data(data)[
|
12
|
+
expect(subject.parse_raw_data(data)[:name]).to eq('My Org')
|
12
13
|
end
|
13
14
|
|
14
15
|
it 'returns the BIC' do
|
15
|
-
expect(subject.parse_raw_data(data)[
|
16
|
+
expect(subject.parse_raw_data(data)[:bic]).to eq('QWERTZ12345')
|
16
17
|
end
|
17
18
|
|
18
19
|
it 'maps the capabilities' do
|
19
|
-
expect(subject.parse_raw_data(data)[
|
20
|
+
expect(subject.parse_raw_data(data)[:sct]).to eq(true)
|
21
|
+
expect(subject.parse_raw_data(data)[:core]).to eq(false)
|
22
|
+
expect(subject.parse_raw_data(data)[:cor1]).to eq(false)
|
23
|
+
expect(subject.parse_raw_data(data)[:b2b]).to eq(false)
|
20
24
|
end
|
21
25
|
end
|
22
26
|
end
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe SepaClearer::PaymentProvider do
|
4
4
|
describe '.new' do
|
5
|
-
subject(:provider) { described_class.new('Testorg', 'SOMEVALIDID'
|
5
|
+
subject(:provider) { described_class.new(name: 'Testorg', bic: 'SOMEVALIDID') }
|
6
6
|
|
7
7
|
it 'sets the proper name' do
|
8
8
|
expect(provider.name).to eq('Testorg')
|
@@ -12,8 +12,52 @@ describe SepaClearer::PaymentProvider do
|
|
12
12
|
expect(provider.bic).to eq('SOMEVALIDID')
|
13
13
|
end
|
14
14
|
|
15
|
-
it '
|
16
|
-
expect(provider.capabilities).to eq([
|
15
|
+
it 'does not set any capabilities' do
|
16
|
+
expect(provider.capabilities).to eq([])
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#capabilities' do
|
21
|
+
subject(:provider) { described_class.new(sct: true, core: false, cor1: true, b2b: true) }
|
22
|
+
|
23
|
+
it 'returns all capabilities' do
|
24
|
+
expect(provider.capabilities).to eq([:sct, :cor1, :b2b])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#direct_debit_instruments' do
|
29
|
+
it 'returns only DD instruments' do
|
30
|
+
allow(subject).to receive(:capabilities).and_return([:b2b, :cor1, :core, :sct])
|
31
|
+
expect(subject.direct_debit_instruments).to eq([:cor1, :core])
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'returns faster cor1 first if order last' do
|
35
|
+
allow(subject).to receive(:capabilities).and_return([:core, :cor1])
|
36
|
+
expect(subject.direct_debit_instruments.first).to eq(:cor1)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'returns faster cor1 first if order properly' do
|
40
|
+
allow(subject).to receive(:capabilities).and_return([:cor1, :core])
|
41
|
+
expect(subject.direct_debit_instruments.first).to eq(:cor1)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#to_hash' do
|
46
|
+
subject(:provider) { described_class.new(name: 'test', bic: 'bic', sct: true, core: false, cor1: true, b2b: true) }
|
47
|
+
|
48
|
+
it 'returns a hash' do
|
49
|
+
expect(provider.to_hash).to be_kind_of(Hash)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'sets correct values' do
|
53
|
+
expect(provider.to_hash).to match({
|
54
|
+
name: 'test',
|
55
|
+
bic: 'BICXXXXXXXX',
|
56
|
+
sct: true,
|
57
|
+
core: false,
|
58
|
+
cor1: true,
|
59
|
+
b2b: true
|
60
|
+
})
|
17
61
|
end
|
18
62
|
end
|
19
63
|
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sepa_clearer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maximilian Schulz
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-10-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sqlite3
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -69,6 +83,7 @@ files:
|
|
69
83
|
- Rakefile
|
70
84
|
- bin/update_data
|
71
85
|
- data/deutsche_bundesbank.csv
|
86
|
+
- data/deutsche_bundesbank.db
|
72
87
|
- lib/sepa_clearer.rb
|
73
88
|
- lib/sepa_clearer/clearer.rb
|
74
89
|
- lib/sepa_clearer/deutsche_bundesbank.rb
|
@@ -83,7 +98,7 @@ homepage: http://opensource.railslove.com/sepa-clearer
|
|
83
98
|
licenses:
|
84
99
|
- MIT
|
85
100
|
metadata: {}
|
86
|
-
post_install_message:
|
101
|
+
post_install_message:
|
87
102
|
rdoc_options: []
|
88
103
|
require_paths:
|
89
104
|
- lib
|
@@ -98,9 +113,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
113
|
- !ruby/object:Gem::Version
|
99
114
|
version: '0'
|
100
115
|
requirements: []
|
101
|
-
|
102
|
-
|
103
|
-
signing_key:
|
116
|
+
rubygems_version: 3.0.8
|
117
|
+
signing_key:
|
104
118
|
specification_version: 4
|
105
119
|
summary: List of all available SEPA clearers and their supported features
|
106
120
|
test_files:
|
@@ -108,4 +122,3 @@ test_files:
|
|
108
122
|
- spec/deutsche_bundesbank_spec.rb
|
109
123
|
- spec/payment_provider_spec.rb
|
110
124
|
- spec/spec_helper.rb
|
111
|
-
has_rdoc:
|