sepa_king 0.0.7 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +22 -11
- data/lib/schema/pain.001.002.03.xsd +450 -450
- data/lib/schema/pain.001.003.03.xsd +474 -0
- data/lib/schema/pain.008.002.02.xsd +597 -597
- data/lib/schema/pain.008.003.02.xsd +614 -0
- data/lib/sepa_king/converter.rb +2 -0
- data/lib/sepa_king/message/credit_transfer.rb +16 -13
- data/lib/sepa_king/message/direct_debit.rb +16 -10
- data/lib/sepa_king/message.rb +27 -3
- data/lib/sepa_king/transaction/credit_transfer_transaction.rb +17 -0
- data/lib/sepa_king/transaction/direct_debit_transaction.rb +10 -1
- data/lib/sepa_king/validator.rb +6 -4
- data/lib/sepa_king/version.rb +1 -1
- data/spec/account_spec.rb +1 -1
- data/spec/converter_spec.rb +7 -0
- data/spec/credit_transfer_spec.rb +52 -4
- data/spec/credit_transfer_transaction_spec.rb +30 -9
- data/spec/direct_debit_spec.rb +56 -3
- data/spec/direct_debit_transaction_spec.rb +32 -11
- data/spec/examples/pain.001.002.03.xml +89 -89
- data/spec/examples/pain.001.003.03.xml +89 -0
- data/spec/examples/pain.008.002.02.xml +134 -134
- data/spec/examples/pain.008.003.02.xml +134 -0
- data/spec/transaction_spec.rb +1 -1
- data/spec/validation_spec.rb +4 -0
- metadata +9 -3
@@ -5,20 +5,15 @@ module SEPA
|
|
5
5
|
self.account_class = DebtorAccount
|
6
6
|
self.transaction_class = CreditTransferTransaction
|
7
7
|
self.xml_main_tag = 'CstmrCdtTrfInitn'
|
8
|
+
self.known_schemas = [ PAIN_001_003_03, PAIN_001_002_03 ]
|
8
9
|
|
9
10
|
private
|
10
|
-
# @return {Hash<Symbol=>String>} xml schema information used in output xml
|
11
|
-
def xml_schema
|
12
|
-
{ :xmlns => 'urn:iso:std:iso:20022:tech:xsd:pain.001.002.03',
|
13
|
-
:'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
14
|
-
:'xsi:schemaLocation' => 'urn:iso:std:iso:20022:tech:xsd:pain.001.002.03 pain.001.002.03.xsd' }
|
15
|
-
end
|
16
|
-
|
17
11
|
# Find groups of transactions which share the same values of some attributes
|
18
12
|
def grouped_transactions
|
19
13
|
transactions.group_by do |transaction|
|
20
14
|
{ requested_date: transaction.requested_date,
|
21
|
-
batch_booking: transaction.batch_booking
|
15
|
+
batch_booking: transaction.batch_booking,
|
16
|
+
service_level: transaction.service_level
|
22
17
|
}
|
23
18
|
end
|
24
19
|
end
|
@@ -35,7 +30,7 @@ module SEPA
|
|
35
30
|
builder.CtrlSum('%.2f' % amount_total(transactions))
|
36
31
|
builder.PmtTpInf do
|
37
32
|
builder.SvcLvl do
|
38
|
-
builder.Cd(
|
33
|
+
builder.Cd(group[:service_level])
|
39
34
|
end
|
40
35
|
end
|
41
36
|
builder.ReqdExctnDt(group[:requested_date].iso8601)
|
@@ -49,7 +44,13 @@ module SEPA
|
|
49
44
|
end
|
50
45
|
builder.DbtrAgt do
|
51
46
|
builder.FinInstnId do
|
52
|
-
|
47
|
+
if account.bic
|
48
|
+
builder.BIC(account.bic)
|
49
|
+
else
|
50
|
+
builder.Othr do
|
51
|
+
builder.Id('NOTPROVIDED')
|
52
|
+
end
|
53
|
+
end
|
53
54
|
end
|
54
55
|
end
|
55
56
|
builder.ChrgBr('SLEV')
|
@@ -69,9 +70,11 @@ module SEPA
|
|
69
70
|
builder.Amt do
|
70
71
|
builder.InstdAmt('%.2f' % transaction.amount, Ccy: 'EUR')
|
71
72
|
end
|
72
|
-
|
73
|
-
builder.
|
74
|
-
builder.
|
73
|
+
if transaction.bic
|
74
|
+
builder.CdtrAgt do
|
75
|
+
builder.FinInstnId do
|
76
|
+
builder.BIC(transaction.bic)
|
77
|
+
end
|
75
78
|
end
|
76
79
|
end
|
77
80
|
builder.Cdtr do
|
@@ -5,21 +5,15 @@ module SEPA
|
|
5
5
|
self.account_class = CreditorAccount
|
6
6
|
self.transaction_class = DirectDebitTransaction
|
7
7
|
self.xml_main_tag = 'CstmrDrctDbtInitn'
|
8
|
+
self.known_schemas = [ PAIN_008_003_02, PAIN_008_002_02 ]
|
8
9
|
|
9
10
|
validate do |record|
|
10
11
|
if record.transactions.map(&:local_instrument).uniq.size > 1
|
11
|
-
errors.add(:base, 'CORE
|
12
|
+
errors.add(:base, 'CORE, COR1 AND B2B must not be mixed in one message!')
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
15
16
|
private
|
16
|
-
# @return {Hash<Symbol=>String>} xml schema information used in output xml
|
17
|
-
def xml_schema
|
18
|
-
{ :xmlns => 'urn:iso:std:iso:20022:tech:xsd:pain.008.002.02',
|
19
|
-
:'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
20
|
-
:'xsi:schemaLocation' => 'urn:iso:std:iso:20022:tech:xsd:pain.008.002.02 pain.008.002.02.xsd' }
|
21
|
-
end
|
22
|
-
|
23
17
|
# Find groups of transactions which share the same values of some attributes
|
24
18
|
def grouped_transactions
|
25
19
|
transactions.group_by do |transaction|
|
@@ -61,7 +55,13 @@ module SEPA
|
|
61
55
|
end
|
62
56
|
builder.CdtrAgt do
|
63
57
|
builder.FinInstnId do
|
64
|
-
|
58
|
+
if group[:account].bic
|
59
|
+
builder.BIC(group[:account].bic)
|
60
|
+
else
|
61
|
+
builder.Othr do
|
62
|
+
builder.Id('NOTPROVIDED')
|
63
|
+
end
|
64
|
+
end
|
65
65
|
end
|
66
66
|
end
|
67
67
|
builder.ChrgBr('SLEV')
|
@@ -99,7 +99,13 @@ module SEPA
|
|
99
99
|
end
|
100
100
|
builder.DbtrAgt do
|
101
101
|
builder.FinInstnId do
|
102
|
-
|
102
|
+
if transaction.bic
|
103
|
+
builder.BIC(transaction.bic)
|
104
|
+
else
|
105
|
+
builder.Othr do
|
106
|
+
builder.Id('NOTPROVIDED')
|
107
|
+
end
|
108
|
+
end
|
103
109
|
end
|
104
110
|
end
|
105
111
|
builder.Dbtr do
|
data/lib/sepa_king/message.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
module SEPA
|
4
|
+
PAIN_008_002_02 = 'pain.008.002.02'
|
5
|
+
PAIN_008_003_02 = 'pain.008.003.02'
|
6
|
+
PAIN_001_002_03 = 'pain.001.002.03'
|
7
|
+
PAIN_001_003_03 = 'pain.001.003.03'
|
8
|
+
|
4
9
|
class Message
|
5
10
|
include ActiveModel::Validations
|
6
11
|
|
@@ -11,7 +16,7 @@ module SEPA
|
|
11
16
|
record.errors.add(:account, 'is invalid') unless record.account.valid?
|
12
17
|
end
|
13
18
|
|
14
|
-
class_attribute :account_class, :transaction_class, :xml_main_tag
|
19
|
+
class_attribute :account_class, :transaction_class, :xml_main_tag, :known_schemas
|
15
20
|
|
16
21
|
def initialize(account_options={})
|
17
22
|
@transactions = []
|
@@ -25,12 +30,13 @@ module SEPA
|
|
25
30
|
end
|
26
31
|
|
27
32
|
# @return [String] xml
|
28
|
-
def to_xml
|
33
|
+
def to_xml(schema_name=self.known_schemas.first)
|
29
34
|
raise RuntimeError.new(errors.full_messages.join("\n")) unless valid?
|
35
|
+
raise RuntimeError.new("Incompatible with schema #{schema_name}!") unless schema_compatible?(schema_name)
|
30
36
|
|
31
37
|
builder = Builder::XmlMarkup.new indent: 2
|
32
38
|
builder.instruct!
|
33
|
-
builder.Document(xml_schema) do
|
39
|
+
builder.Document(xml_schema(schema_name)) do
|
34
40
|
builder.__send__(xml_main_tag) do
|
35
41
|
build_group_header(builder)
|
36
42
|
build_payment_informations(builder)
|
@@ -42,7 +48,25 @@ module SEPA
|
|
42
48
|
selected_transactions.inject(0) { |sum, t| sum + t.amount }
|
43
49
|
end
|
44
50
|
|
51
|
+
def schema_compatible?(schema_name)
|
52
|
+
raise ArgumentError.new("Schema #{schema_name} is unknown!") unless self.known_schemas.include?(schema_name)
|
53
|
+
|
54
|
+
case schema_name
|
55
|
+
when PAIN_001_002_03, PAIN_008_002_02
|
56
|
+
account.bic.present? && transactions.all? { |t| t.schema_compatible?(schema_name) }
|
57
|
+
when PAIN_001_003_03, PAIN_008_003_02
|
58
|
+
transactions.all? { |t| t.schema_compatible?(schema_name) }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
45
62
|
private
|
63
|
+
# @return {Hash<Symbol=>String>} xml schema information used in output xml
|
64
|
+
def xml_schema(schema_name)
|
65
|
+
{ :xmlns => "urn:iso:std:iso:20022:tech:xsd:#{schema_name}",
|
66
|
+
:'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
67
|
+
:'xsi:schemaLocation' => "urn:iso:std:iso:20022:tech:xsd:#{schema_name} #{schema_name}.xsd" }
|
68
|
+
end
|
69
|
+
|
46
70
|
def build_group_header(builder)
|
47
71
|
builder.GrpHdr do
|
48
72
|
builder.MsgId(message_identification)
|
@@ -1,5 +1,22 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
module SEPA
|
3
3
|
class CreditTransferTransaction < Transaction
|
4
|
+
attr_accessor :service_level
|
5
|
+
|
6
|
+
validates_inclusion_of :service_level, :in => %w(SEPA URGP)
|
7
|
+
|
8
|
+
def initialize(attributes = {})
|
9
|
+
super
|
10
|
+
self.service_level ||= 'SEPA'
|
11
|
+
end
|
12
|
+
|
13
|
+
def schema_compatible?(schema_name)
|
14
|
+
case schema_name
|
15
|
+
when PAIN_001_002_03
|
16
|
+
self.bic.present? && self.service_level == 'SEPA'
|
17
|
+
when PAIN_001_003_03
|
18
|
+
true
|
19
|
+
end
|
20
|
+
end
|
4
21
|
end
|
5
22
|
end
|
@@ -5,7 +5,7 @@ module SEPA
|
|
5
5
|
|
6
6
|
validates_length_of :mandate_id, within: 1..35
|
7
7
|
validates_presence_of :mandate_date_of_signature
|
8
|
-
validates_inclusion_of :local_instrument, :in => %w(CORE B2B)
|
8
|
+
validates_inclusion_of :local_instrument, :in => %w(CORE COR1 B2B)
|
9
9
|
validates_inclusion_of :sequence_type, :in => %w(FRST OOFF RCUR FNAL)
|
10
10
|
|
11
11
|
validate do |t|
|
@@ -25,5 +25,14 @@ module SEPA
|
|
25
25
|
self.local_instrument ||= 'CORE'
|
26
26
|
self.sequence_type ||= 'OOFF'
|
27
27
|
end
|
28
|
+
|
29
|
+
def schema_compatible?(schema_name)
|
30
|
+
case schema_name
|
31
|
+
when PAIN_008_002_02
|
32
|
+
self.bic.present? && %w(CORE B2B).include?(self.local_instrument)
|
33
|
+
when PAIN_008_003_02
|
34
|
+
true
|
35
|
+
end
|
36
|
+
end
|
28
37
|
end
|
29
38
|
end
|
data/lib/sepa_king/validator.rb
CHANGED
@@ -3,15 +3,17 @@ module SEPA
|
|
3
3
|
class IBANValidator < ActiveModel::Validator
|
4
4
|
def validate(record)
|
5
5
|
unless IBANTools::IBAN.valid?(record.iban.to_s)
|
6
|
-
record.errors.add(:iban,
|
6
|
+
record.errors.add(:iban, :invalid)
|
7
7
|
end
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
11
|
class BICValidator < ActiveModel::Validator
|
12
12
|
def validate(record)
|
13
|
-
|
14
|
-
record.
|
13
|
+
if record.bic
|
14
|
+
unless record.bic.to_s.match /[A-Z]{6,6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3,3}){0,1}/
|
15
|
+
record.errors.add(:bic, :invalid)
|
16
|
+
end
|
15
17
|
end
|
16
18
|
end
|
17
19
|
end
|
@@ -19,7 +21,7 @@ module SEPA
|
|
19
21
|
class CreditorIdentifierValidator < ActiveModel::Validator
|
20
22
|
def validate(record)
|
21
23
|
unless valid?(record.creditor_identifier)
|
22
|
-
record.errors.add(:creditor_identifier,
|
24
|
+
record.errors.add(:creditor_identifier, :invalid)
|
23
25
|
end
|
24
26
|
end
|
25
27
|
|
data/lib/sepa_king/version.rb
CHANGED
data/spec/account_spec.rb
CHANGED
data/spec/converter_spec.rb
CHANGED
@@ -17,6 +17,13 @@ describe SEPA::Converter do
|
|
17
17
|
convert_text('üöäÜÖÄß').should == 'ueoeaeUEOEAEss'
|
18
18
|
end
|
19
19
|
|
20
|
+
it 'should convert line breaks' do
|
21
|
+
convert_text("one\ntwo") .should == 'one two'
|
22
|
+
convert_text("one\ntwo\n") .should == 'one two'
|
23
|
+
convert_text("\none\ntwo\n").should == 'one two'
|
24
|
+
convert_text("one\n\ntwo") .should == 'one two'
|
25
|
+
end
|
26
|
+
|
20
27
|
it 'should convert number' do
|
21
28
|
convert_text(1234).should == '1234'
|
22
29
|
end
|
@@ -42,6 +42,55 @@ describe SEPA::CreditTransfer do
|
|
42
42
|
end
|
43
43
|
|
44
44
|
context 'for valid debtor' do
|
45
|
+
context 'without BIC (IBAN-only)' do
|
46
|
+
subject do
|
47
|
+
sct = SEPA::CreditTransfer.new name: 'Schuldner GmbH',
|
48
|
+
iban: 'DE87200500001234567890'
|
49
|
+
|
50
|
+
sct.add_transaction name: 'Telekomiker AG',
|
51
|
+
bic: 'PBNKDEFF370',
|
52
|
+
iban: 'DE37112589611964645802',
|
53
|
+
amount: 102.50,
|
54
|
+
reference: 'XYZ-1234/123',
|
55
|
+
remittance_information: 'Rechnung vom 22.08.2013'
|
56
|
+
|
57
|
+
sct
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should create valid XML file' do
|
61
|
+
expect(subject.to_xml).to validate_against('pain.001.003.03.xsd')
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should fail for pain.001.002.03' do
|
65
|
+
expect {
|
66
|
+
subject.to_xml(SEPA::PAIN_001_002_03)
|
67
|
+
}.to raise_error(RuntimeError)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'with BIC' do
|
72
|
+
subject do
|
73
|
+
sct = credit_transfer
|
74
|
+
|
75
|
+
sct.add_transaction name: 'Telekomiker AG',
|
76
|
+
bic: 'PBNKDEFF370',
|
77
|
+
iban: 'DE37112589611964645802',
|
78
|
+
amount: 102.50,
|
79
|
+
reference: 'XYZ-1234/123',
|
80
|
+
remittance_information: 'Rechnung vom 22.08.2013'
|
81
|
+
|
82
|
+
sct
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'should validate against pain.001.002.03' do
|
86
|
+
expect(subject.to_xml('pain.001.002.03')).to validate_against('pain.001.002.03.xsd')
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should validate against pain.001.003.03' do
|
90
|
+
expect(subject.to_xml('pain.001.003.03')).to validate_against('pain.001.003.03.xsd')
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
45
94
|
context 'without requested_date given' do
|
46
95
|
subject do
|
47
96
|
sct = credit_transfer
|
@@ -54,7 +103,6 @@ describe SEPA::CreditTransfer do
|
|
54
103
|
remittance_information: 'Rechnung vom 22.08.2013'
|
55
104
|
|
56
105
|
sct.add_transaction name: 'Amazonas GmbH',
|
57
|
-
bic: 'TUBDDEDDXXX',
|
58
106
|
iban: 'DE27793589132923472195',
|
59
107
|
amount: 59.00,
|
60
108
|
reference: 'XYZ-5678/456',
|
@@ -64,7 +112,7 @@ describe SEPA::CreditTransfer do
|
|
64
112
|
end
|
65
113
|
|
66
114
|
it 'should create valid XML file' do
|
67
|
-
expect(subject).to validate_against('pain.001.
|
115
|
+
expect(subject).to validate_against('pain.001.003.03.xsd')
|
68
116
|
end
|
69
117
|
|
70
118
|
it 'should have message_identification' do
|
@@ -117,9 +165,9 @@ describe SEPA::CreditTransfer do
|
|
117
165
|
subject.should have_xml('//Document/CstmrCdtTrfInitn/PmtInf/CdtTrfTxInf[2]/Amt/InstdAmt', '59.00')
|
118
166
|
end
|
119
167
|
|
120
|
-
it 'should contain <CdtrAgt>' do
|
168
|
+
it 'should contain <CdtrAgt> for every BIC given' do
|
121
169
|
subject.should have_xml('//Document/CstmrCdtTrfInitn/PmtInf/CdtTrfTxInf[1]/CdtrAgt/FinInstnId/BIC', 'PBNKDEFF370')
|
122
|
-
subject.
|
170
|
+
subject.should_not have_xml('//Document/CstmrCdtTrfInitn/PmtInf/CdtTrfTxInf[2]/CdtrAgt')
|
123
171
|
end
|
124
172
|
|
125
173
|
it 'should contain <Cdtr>' do
|
@@ -2,14 +2,35 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe SEPA::CreditTransferTransaction do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
5
|
+
describe :initialize do
|
6
|
+
it 'should initialize a valid transaction' do
|
7
|
+
expect(
|
8
|
+
SEPA::CreditTransferTransaction.new name: 'Telekomiker AG',
|
9
|
+
iban: 'DE37112589611964645802',
|
10
|
+
bic: 'PBNKDEFF370',
|
11
|
+
amount: 102.50,
|
12
|
+
reference: 'XYZ-1234/123',
|
13
|
+
remittance_information: 'Rechnung 123 vom 22.08.2013'
|
14
|
+
).to be_valid
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe :schema_compatible? do
|
19
|
+
context 'for pain.001.003.03' do
|
20
|
+
it 'should success' do
|
21
|
+
SEPA::CreditTransferTransaction.new({}).should be_schema_compatible('pain.001.003.03')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'pain.001.002.03' do
|
26
|
+
it 'should success for valid attributes' do
|
27
|
+
SEPA::CreditTransferTransaction.new(:bic => 'SPUEDE2UXXX', :service_level => 'SEPA').should be_schema_compatible('pain.001.002.03')
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should fail for invalid attributes' do
|
31
|
+
SEPA::CreditTransferTransaction.new(:bic => nil).should_not be_schema_compatible('pain.001.002.03')
|
32
|
+
SEPA::CreditTransferTransaction.new(:bic => 'SPUEDE2UXXX', :service_level => 'URGP').should_not be_schema_compatible('pain.001.002.03')
|
33
|
+
end
|
34
|
+
end
|
14
35
|
end
|
15
36
|
end
|
data/spec/direct_debit_spec.rb
CHANGED
@@ -43,6 +43,60 @@ describe SEPA::DirectDebit do
|
|
43
43
|
end
|
44
44
|
|
45
45
|
context 'for valid creditor' do
|
46
|
+
context 'without BIC (IBAN-only)' do
|
47
|
+
subject do
|
48
|
+
sdd = SEPA::DirectDebit.new name: 'Gläubiger GmbH',
|
49
|
+
iban: 'DE87200500001234567890',
|
50
|
+
creditor_identifier: 'DE98ZZZ09999999999'
|
51
|
+
|
52
|
+
sdd.add_transaction name: 'Zahlemann & Söhne GbR',
|
53
|
+
bic: 'SPUEDE2UXXX',
|
54
|
+
iban: 'DE21500500009876543210',
|
55
|
+
amount: 39.99,
|
56
|
+
reference: 'XYZ/2013-08-ABO/12345',
|
57
|
+
remittance_information: 'Unsere Rechnung vom 10.08.2013',
|
58
|
+
mandate_id: 'K-02-2011-12345',
|
59
|
+
mandate_date_of_signature: Date.new(2011,1,25)
|
60
|
+
|
61
|
+
sdd
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should create valid XML file' do
|
65
|
+
expect(subject.to_xml).to validate_against('pain.008.003.02.xsd')
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should fail for pain.008.002.02' do
|
69
|
+
expect {
|
70
|
+
subject.to_xml(SEPA::PAIN_008_002_02)
|
71
|
+
}.to raise_error(RuntimeError)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
context 'with BIC' do
|
76
|
+
subject do
|
77
|
+
sdd = direct_debit
|
78
|
+
|
79
|
+
sdd.add_transaction name: 'Zahlemann & Söhne GbR',
|
80
|
+
bic: 'SPUEDE2UXXX',
|
81
|
+
iban: 'DE21500500009876543210',
|
82
|
+
amount: 39.99,
|
83
|
+
reference: 'XYZ/2013-08-ABO/12345',
|
84
|
+
remittance_information: 'Unsere Rechnung vom 10.08.2013',
|
85
|
+
mandate_id: 'K-02-2011-12345',
|
86
|
+
mandate_date_of_signature: Date.new(2011,1,25)
|
87
|
+
|
88
|
+
sdd
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'should validate against pain.008.002.02' do
|
92
|
+
expect(subject.to_xml('pain.008.002.02')).to validate_against('pain.008.002.02.xsd')
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'should validate against pain.008.003.02' do
|
96
|
+
expect(subject.to_xml('pain.008.003.02')).to validate_against('pain.008.003.02.xsd')
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
46
100
|
context 'without requested_date given' do
|
47
101
|
subject do
|
48
102
|
sdd = direct_debit
|
@@ -57,7 +111,6 @@ describe SEPA::DirectDebit do
|
|
57
111
|
mandate_date_of_signature: Date.new(2011,1,25)
|
58
112
|
|
59
113
|
sdd.add_transaction name: 'Meier & Schulze oHG',
|
60
|
-
bic: 'GENODEF1JEV',
|
61
114
|
iban: 'DE68210501700012345678',
|
62
115
|
amount: 750.00,
|
63
116
|
reference: 'XYZ/2013-08-ABO/6789',
|
@@ -69,7 +122,7 @@ describe SEPA::DirectDebit do
|
|
69
122
|
end
|
70
123
|
|
71
124
|
it 'should create valid XML file' do
|
72
|
-
expect(subject).to validate_against('pain.008.
|
125
|
+
expect(subject).to validate_against('pain.008.003.02.xsd')
|
73
126
|
end
|
74
127
|
|
75
128
|
it 'should have message_identification' do
|
@@ -138,7 +191,7 @@ describe SEPA::DirectDebit do
|
|
138
191
|
|
139
192
|
it 'should contain <DbtrAgt>' do
|
140
193
|
subject.should have_xml('//Document/CstmrDrctDbtInitn/PmtInf/DrctDbtTxInf[1]/DbtrAgt/FinInstnId/BIC', 'SPUEDE2UXXX')
|
141
|
-
subject.should have_xml('//Document/CstmrDrctDbtInitn/PmtInf/DrctDbtTxInf[2]/DbtrAgt/FinInstnId/
|
194
|
+
subject.should have_xml('//Document/CstmrDrctDbtInitn/PmtInf/DrctDbtTxInf[2]/DbtrAgt/FinInstnId/Othr/Id', 'NOTPROVIDED')
|
142
195
|
end
|
143
196
|
|
144
197
|
it 'should contain <Dbtr>' do
|
@@ -2,17 +2,38 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe SEPA::DirectDebitTransaction do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
5
|
+
describe :initialize do
|
6
|
+
it 'should create a valid transaction' do
|
7
|
+
expect(
|
8
|
+
SEPA::DirectDebitTransaction.new name: 'Zahlemann & Söhne Gbr',
|
9
|
+
bic: 'SPUEDE2UXXX',
|
10
|
+
iban: 'DE21500500009876543210',
|
11
|
+
amount: 39.99,
|
12
|
+
reference: 'XYZ-1234/123',
|
13
|
+
remittance_information: 'Vielen Dank für Ihren Einkauf!',
|
14
|
+
mandate_id: 'K-02-2011-12345',
|
15
|
+
mandate_date_of_signature: Date.new(2011,1,25)
|
16
|
+
).to be_valid
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe :schema_compatible? do
|
21
|
+
context 'for pain.008.003.02' do
|
22
|
+
it 'should success' do
|
23
|
+
SEPA::DirectDebitTransaction.new({}).should be_schema_compatible('pain.008.003.02')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'for pain.008.002.02' do
|
28
|
+
it 'should success for valid attributes' do
|
29
|
+
SEPA::DirectDebitTransaction.new(:bic => 'SPUEDE2UXXX', :local_instrument => 'CORE').should be_schema_compatible('pain.008.002.02')
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should fail for invalid attributes' do
|
33
|
+
SEPA::DirectDebitTransaction.new(:bic => nil).should_not be_schema_compatible('pain.008.002.02')
|
34
|
+
SEPA::DirectDebitTransaction.new(:bic => 'SPUEDE2UXXX', :local_instrument => 'COR1').should_not be_schema_compatible('pain.008.002.02')
|
35
|
+
end
|
36
|
+
end
|
16
37
|
end
|
17
38
|
|
18
39
|
context 'Mandate Date of Signature' do
|