sepa_king 0.0.2
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 +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +2 -0
- data/MIT-LICENSE +22 -0
- data/README.markdown +60 -0
- data/Rakefile +6 -0
- data/lib/schema/pain.001.002.03.xsd +450 -0
- data/lib/schema/pain.008.002.02.xsd +597 -0
- data/lib/sepa_king/account.rb +37 -0
- data/lib/sepa_king/credit_transaction.rb +48 -0
- data/lib/sepa_king/credit_transfer_initiation.rb +102 -0
- data/lib/sepa_king/debt_transaction.rb +53 -0
- data/lib/sepa_king/direct_debit_initiation.rb +117 -0
- data/lib/sepa_king/exception.rb +5 -0
- data/lib/sepa_king/text_converter.rb +25 -0
- data/lib/sepa_king/version.rb +3 -0
- data/lib/sepa_king.rb +11 -0
- data/sepa_king.gemspec +31 -0
- data/spec/fixtures/pain.001.002.03.xml +89 -0
- data/spec/fixtures/pain.008.002.02.xml +134 -0
- data/spec/sepa_king/account_spec.rb +13 -0
- data/spec/sepa_king/credit_transaction_spec.rb +15 -0
- data/spec/sepa_king/credit_transfer_initiation_spec.rb +27 -0
- data/spec/sepa_king/debt_transaction_spec.rb +16 -0
- data/spec/sepa_king/direct_debit_inititation_spec.rb +29 -0
- data/spec/sepa_king/text_converter_spec.rb +22 -0
- data/spec/sepa_king/validation_spec.rb +13 -0
- data/spec/spec_helper.rb +28 -0
- data/spec/support/custom_matcher.rb +9 -0
- metadata +169 -0
@@ -0,0 +1,48 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module SEPA
|
3
|
+
class CreditTransaction
|
4
|
+
include TextConverter
|
5
|
+
attr_reader :name, :iban, :bic, :amount, :reference, :remittance_information
|
6
|
+
|
7
|
+
def initialize(options)
|
8
|
+
options.each_pair do |k,v|
|
9
|
+
send("#{k}=", v)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def name=(value)
|
14
|
+
raise ArgumentError.new('Name is missing') unless value
|
15
|
+
@name = convert_text(value)
|
16
|
+
end
|
17
|
+
|
18
|
+
def iban=(value)
|
19
|
+
raise ArgumentError.new('IBAN is missing') unless value
|
20
|
+
raise ArgumentError.new("IBAN has wrong length: #{value.length}, must be between 15-34") unless value.length.between?(15,34)
|
21
|
+
@iban = value
|
22
|
+
end
|
23
|
+
|
24
|
+
def bic=(value)
|
25
|
+
raise ArgumentError.new('BIC is missing') unless value
|
26
|
+
raise ArgumentError.new("BIC has wrong length: #{value.length} must be between 8-11") unless value.length.between?(8,11)
|
27
|
+
@bic = value
|
28
|
+
end
|
29
|
+
|
30
|
+
def amount=(value)
|
31
|
+
raise ArgumentError.new('Amount is not a number') unless value.is_a?(Numeric)
|
32
|
+
raise ArgumentError.new('Amount cannot be zero') if value.zero?
|
33
|
+
raise ArgumentError.new('Amount cannot be negative') if value < 0
|
34
|
+
@amount = value
|
35
|
+
end
|
36
|
+
|
37
|
+
def reference=(value)
|
38
|
+
raise ArgumentError.new('Reference is missing') unless value
|
39
|
+
raise ArgumentError.new("Reference has wrong length: #{value.length}, must be 35 maximum") if value.length > 35
|
40
|
+
@reference = convert_text(value)
|
41
|
+
end
|
42
|
+
|
43
|
+
def remittance_information=(value)
|
44
|
+
raise ArgumentError.new('Remittance information is missing') unless value
|
45
|
+
@remittance_information = convert_text(value)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module SEPA
|
4
|
+
class CreditTransferInitiation
|
5
|
+
attr_reader :debitor, :transactions
|
6
|
+
|
7
|
+
def initialize(debitor_options)
|
8
|
+
@debitor = Account.new(debitor_options)
|
9
|
+
@transactions = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_transaction(options)
|
13
|
+
@transactions << CreditTransaction.new(options)
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_xml
|
17
|
+
builder = Builder::XmlMarkup.new :indent => 2
|
18
|
+
builder.instruct!
|
19
|
+
builder.Document :xmlns => 'urn:iso:std:iso:20022:tech:xsd:pain.001.002.03',
|
20
|
+
:'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
21
|
+
:'xsi:schemaLocation' => 'urn:iso:std:iso:20022:tech:xsd:pain.001.002.03 pain.001.002.03.xsd' do
|
22
|
+
builder.CstmrCdtTrfInitn do
|
23
|
+
builder.GrpHdr do
|
24
|
+
builder.MsgId(message_identification)
|
25
|
+
builder.CreDtTm(Time.now.iso8601)
|
26
|
+
builder.NbOfTxs(transactions.length)
|
27
|
+
builder.InitgPty do
|
28
|
+
builder.Nm(debitor.name)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
builder.PmtInf do
|
33
|
+
builder.PmtInfId(payment_information_identification)
|
34
|
+
builder.PmtMtd('TRF')
|
35
|
+
builder.BtchBookg(true)
|
36
|
+
builder.NbOfTxs(transactions.length)
|
37
|
+
builder.CtrlSum(amount_total)
|
38
|
+
builder.PmtTpInf do
|
39
|
+
builder.SvcLvl do
|
40
|
+
builder.Cd('SEPA')
|
41
|
+
end
|
42
|
+
end
|
43
|
+
builder.ReqdExctnDt(Date.today.next.iso8601)
|
44
|
+
builder.Dbtr do
|
45
|
+
builder.Nm(debitor.name)
|
46
|
+
end
|
47
|
+
builder.DbtrAcct do
|
48
|
+
builder.Id do
|
49
|
+
builder.IBAN(debitor.iban)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
builder.DbtrAgt do
|
53
|
+
builder.FinInstnId do
|
54
|
+
builder.BIC(debitor.bic)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
builder.ChrgBr('SLEV')
|
58
|
+
transactions.each do |transaction|
|
59
|
+
builder.CdtTrfTxInf do
|
60
|
+
builder.PmtId do
|
61
|
+
builder.EndToEndId(transaction.reference || 'NOTPROVIDED')
|
62
|
+
end
|
63
|
+
builder.Amt do
|
64
|
+
builder.InstdAmt(transaction.amount, :Ccy => 'EUR')
|
65
|
+
end
|
66
|
+
builder.CdtrAgt do
|
67
|
+
builder.FinInstnId do
|
68
|
+
builder.BIC(transaction.bic)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
builder.Cdtr do
|
72
|
+
builder.Nm(transaction.name)
|
73
|
+
end
|
74
|
+
builder.CdtrAcct do
|
75
|
+
builder.Id do
|
76
|
+
builder.IBAN(transaction.iban)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
builder.RmtInf do
|
80
|
+
builder.Ustrd(transaction.remittance_information)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
def amount_total
|
91
|
+
transactions.inject(0) { |sum, t| sum + t.amount }
|
92
|
+
end
|
93
|
+
|
94
|
+
def message_identification
|
95
|
+
"SEPA-KING/#{Time.now.iso8601}"
|
96
|
+
end
|
97
|
+
|
98
|
+
def payment_information_identification
|
99
|
+
message_identification
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module SEPA
|
3
|
+
class DebtTransaction
|
4
|
+
include TextConverter
|
5
|
+
attr_reader :name, :iban, :bic, :amount, :reference, :mandate_id, :mandate_date_of_signature
|
6
|
+
|
7
|
+
def initialize(options)
|
8
|
+
options.each_pair do |k,v|
|
9
|
+
send("#{k}=", v)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def name=(value)
|
14
|
+
raise ArgumentError.new('Name is missing') unless value
|
15
|
+
@name = convert_text(value)
|
16
|
+
end
|
17
|
+
|
18
|
+
def iban=(value)
|
19
|
+
raise ArgumentError.new('IBAN is missing') unless value
|
20
|
+
raise ArgumentError.new("IBAN has wrong length: #{value.length}, must be between 15-34") unless value.length.between?(15,34)
|
21
|
+
@iban = value
|
22
|
+
end
|
23
|
+
|
24
|
+
def bic=(value)
|
25
|
+
raise ArgumentError.new('BIC is missing') unless value
|
26
|
+
raise ArgumentError.new("BIC has wrong length: #{value.length} must be between 8-11") unless value.length.between?(8,11)
|
27
|
+
@bic = value
|
28
|
+
end
|
29
|
+
|
30
|
+
def amount=(value)
|
31
|
+
raise ArgumentError.new('Amount is not a Number') unless value.is_a?(Numeric)
|
32
|
+
raise ArgumentError.new('Amount cannot be zero') if value.zero?
|
33
|
+
raise ArgumentError.new('Amount cannot be negative') if value < 0
|
34
|
+
@amount = value
|
35
|
+
end
|
36
|
+
|
37
|
+
def reference=(value)
|
38
|
+
raise ArgumentError.new('Reference is missing') unless value
|
39
|
+
raise ArgumentError.new("Reference has wrong length: #{value.length}, must be 35 maximum") if value.length > 35
|
40
|
+
@reference = convert_text(value)
|
41
|
+
end
|
42
|
+
|
43
|
+
def mandate_id=(value)
|
44
|
+
raise ArgumentError.new('Mandate ID is missing') unless value
|
45
|
+
@mandate_id = convert_text(value)
|
46
|
+
end
|
47
|
+
|
48
|
+
def mandate_date_of_signature=(value)
|
49
|
+
raise ArgumentError.new('Mandate Date of Signature is missing') unless value.is_a?(Date)
|
50
|
+
@mandate_date_of_signature = value
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module SEPA
|
4
|
+
class DirectDebitInitiation
|
5
|
+
attr_reader :creditor, :transactions
|
6
|
+
|
7
|
+
def initialize(creditor_options)
|
8
|
+
@creditor = Account.new(creditor_options)
|
9
|
+
@transactions = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_transaction(options)
|
13
|
+
@transactions << DebtTransaction.new(options)
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_xml
|
17
|
+
builder = Builder::XmlMarkup.new :indent => 2
|
18
|
+
builder.instruct!
|
19
|
+
builder.Document :xmlns => 'urn:iso:std:iso:20022:tech:xsd:pain.008.002.02',
|
20
|
+
:'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
21
|
+
:'xsi:schemaLocation' => 'urn:iso:std:iso:20022:tech:xsd:pain.008.002.02 pain.008.002.02.xsd' do
|
22
|
+
builder.CstmrDrctDbtInitn do
|
23
|
+
builder.GrpHdr do
|
24
|
+
builder.MsgId(message_identification)
|
25
|
+
builder.CreDtTm(Time.now.iso8601)
|
26
|
+
builder.NbOfTxs(transactions.length)
|
27
|
+
builder.CtrlSum(amount_total)
|
28
|
+
builder.InitgPty do
|
29
|
+
builder.Nm(creditor.name)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
builder.PmtInf do
|
34
|
+
builder.PmtInfId(payment_information_identification)
|
35
|
+
builder.PmtMtd('DD')
|
36
|
+
builder.PmtTpInf do
|
37
|
+
builder.SvcLvl do
|
38
|
+
builder.Cd('SEPA')
|
39
|
+
end
|
40
|
+
builder.LclInstrm do
|
41
|
+
builder.Cd('CORE')
|
42
|
+
end
|
43
|
+
builder.SeqTp('OOFF')
|
44
|
+
end
|
45
|
+
builder.ReqdColltnDt(Date.today.next.iso8601)
|
46
|
+
builder.Cdtr do
|
47
|
+
builder.Nm(creditor.name)
|
48
|
+
end
|
49
|
+
builder.CdtrAcct do
|
50
|
+
builder.Id do
|
51
|
+
builder.IBAN(creditor.iban)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
builder.CdtrAgt do
|
55
|
+
builder.FinInstnId do
|
56
|
+
builder.BIC(creditor.bic)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
builder.ChrgBr('SLEV')
|
60
|
+
builder.CdtrSchmeId do
|
61
|
+
builder.Id do
|
62
|
+
builder.PrvtId do
|
63
|
+
builder.Othr do
|
64
|
+
builder.Id(creditor.identifier)
|
65
|
+
builder.SchmeNm do
|
66
|
+
builder.Prtry('SEPA')
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
transactions.each do |transaction|
|
73
|
+
builder.DrctDbtTxInf do
|
74
|
+
builder.PmtId do
|
75
|
+
builder.EndToEndId(transaction.reference || 'NOTPROVIDED')
|
76
|
+
end
|
77
|
+
builder.InstdAmt(transaction.amount, :Ccy => 'EUR')
|
78
|
+
builder.DrctDbtTx do
|
79
|
+
builder.MndtRltdInf do
|
80
|
+
builder.MndtId(transaction.mandate_id)
|
81
|
+
builder.DtOfSgntr(transaction.mandate_date_of_signature.iso8601)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
builder.DbtrAgt do
|
85
|
+
builder.FinInstnId do
|
86
|
+
builder.BIC(transaction.bic)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
builder.Dbtr do
|
90
|
+
builder.Nm(transaction.name)
|
91
|
+
end
|
92
|
+
builder.DbtrAcct do
|
93
|
+
builder.Id do
|
94
|
+
builder.IBAN(transaction.iban)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
def amount_total
|
106
|
+
transactions.inject(0) { |sum, t| sum + t.amount }
|
107
|
+
end
|
108
|
+
|
109
|
+
def message_identification
|
110
|
+
"SEPA-KING/#{Time.now.iso8601}"
|
111
|
+
end
|
112
|
+
|
113
|
+
def payment_information_identification
|
114
|
+
message_identification
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module SEPA
|
3
|
+
module TextConverter
|
4
|
+
def convert_text(text)
|
5
|
+
text = text.to_s
|
6
|
+
return text if text.empty?
|
7
|
+
|
8
|
+
text = text.
|
9
|
+
# Convert german umlauts
|
10
|
+
gsub('Ä', 'AE').
|
11
|
+
gsub('Ü', 'UE').
|
12
|
+
gsub('Ö', 'OE').
|
13
|
+
gsub('ä', 'ae').
|
14
|
+
gsub('ü', 'ue').
|
15
|
+
gsub('ö', 'oe').
|
16
|
+
gsub('ß', 'ss')
|
17
|
+
|
18
|
+
I18n.transliterate(text).
|
19
|
+
# Remove all invalid characters
|
20
|
+
gsub(/[^a-zA-Z0-9\ \'\:\?\,\-\(\+\.\)\/]/, '').
|
21
|
+
# Remove leading and trailing spaces
|
22
|
+
strip
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/sepa_king.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'i18n'
|
2
|
+
require 'bigdecimal'
|
3
|
+
require 'builder'
|
4
|
+
|
5
|
+
require 'sepa_king/text_converter'
|
6
|
+
require 'sepa_king/account'
|
7
|
+
require 'sepa_king/debt_transaction'
|
8
|
+
require 'sepa_king/credit_transaction'
|
9
|
+
require 'sepa_king/exception'
|
10
|
+
require 'sepa_king/direct_debit_initiation'
|
11
|
+
require 'sepa_king/credit_transfer_initiation'
|
data/sepa_king.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
require 'sepa_king/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = %q{sepa_king}
|
7
|
+
s.version = SEPA::VERSION
|
8
|
+
|
9
|
+
s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
|
10
|
+
s.authors = ['Georg Leciejewski', 'Georg Ledermann']
|
11
|
+
s.date = %q{2013-08-10}
|
12
|
+
s.summary = %q{Generate SEPA XML files with Ruby .. the easy way}
|
13
|
+
s.description = %q{}
|
14
|
+
s.email = %q{gl@salesking.eu}
|
15
|
+
s.extra_rdoc_files = ['README.markdown']
|
16
|
+
s.executables = nil
|
17
|
+
s.files = `git ls-files`.split("\n").reject{|i| i[/^docs\//] }
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
|
20
|
+
s.homepage = %q{http://github.com/salesking/sepa_king}
|
21
|
+
s.require_paths = ['lib']
|
22
|
+
s.rubygems_version = %q{1.6.2}
|
23
|
+
|
24
|
+
s.add_runtime_dependency 'i18n'
|
25
|
+
s.add_runtime_dependency 'builder'
|
26
|
+
|
27
|
+
s.add_development_dependency 'rspec'
|
28
|
+
s.add_development_dependency 'simplecov'
|
29
|
+
s.add_development_dependency 'rake', '>= 0.9.2'
|
30
|
+
s.add_development_dependency 'libxml-ruby'
|
31
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!-- Mit XMLSpy v2008 rel. 2 sp2 (http://www.altova.com) von benutzerservice benutzerservice (SIZ GmbH) bearbeitet -->
|
3
|
+
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.002.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.001.002.03 pain.001.002.03.xsd">
|
4
|
+
<CstmrCdtTrfInitn>
|
5
|
+
<GrpHdr>
|
6
|
+
<MsgId>Message-ID-4711</MsgId>
|
7
|
+
<CreDtTm>2010-11-11T09:30:47.000Z</CreDtTm>
|
8
|
+
<NbOfTxs>2</NbOfTxs>
|
9
|
+
<InitgPty>
|
10
|
+
<Nm>Initiator Name</Nm>
|
11
|
+
</InitgPty>
|
12
|
+
</GrpHdr>
|
13
|
+
<PmtInf>
|
14
|
+
<PmtInfId>Payment-Information-ID-4711</PmtInfId>
|
15
|
+
<PmtMtd>TRF</PmtMtd>
|
16
|
+
<BtchBookg>true</BtchBookg>
|
17
|
+
<NbOfTxs>2</NbOfTxs>
|
18
|
+
<CtrlSum>6655.86</CtrlSum>
|
19
|
+
<PmtTpInf>
|
20
|
+
<SvcLvl>
|
21
|
+
<Cd>SEPA</Cd>
|
22
|
+
</SvcLvl>
|
23
|
+
</PmtTpInf>
|
24
|
+
<ReqdExctnDt>2010-11-25</ReqdExctnDt>
|
25
|
+
<Dbtr>
|
26
|
+
<Nm>Debtor Name</Nm>
|
27
|
+
</Dbtr>
|
28
|
+
<DbtrAcct>
|
29
|
+
<Id>
|
30
|
+
<IBAN>DE87200500001234567890</IBAN>
|
31
|
+
</Id>
|
32
|
+
</DbtrAcct>
|
33
|
+
<DbtrAgt>
|
34
|
+
<FinInstnId>
|
35
|
+
<BIC>BANKDEFFXXX</BIC>
|
36
|
+
</FinInstnId>
|
37
|
+
</DbtrAgt>
|
38
|
+
<ChrgBr>SLEV</ChrgBr>
|
39
|
+
<CdtTrfTxInf>
|
40
|
+
<PmtId>
|
41
|
+
<EndToEndId>OriginatorID1234</EndToEndId>
|
42
|
+
</PmtId>
|
43
|
+
<Amt>
|
44
|
+
<InstdAmt Ccy="EUR">6543.14</InstdAmt>
|
45
|
+
</Amt>
|
46
|
+
<CdtrAgt>
|
47
|
+
<FinInstnId>
|
48
|
+
<BIC>SPUEDE2UXXX</BIC>
|
49
|
+
</FinInstnId>
|
50
|
+
</CdtrAgt>
|
51
|
+
<Cdtr>
|
52
|
+
<Nm>Creditor Name</Nm>
|
53
|
+
</Cdtr>
|
54
|
+
<CdtrAcct>
|
55
|
+
<Id>
|
56
|
+
<IBAN>DE21500500009876543210</IBAN>
|
57
|
+
</Id>
|
58
|
+
</CdtrAcct>
|
59
|
+
<RmtInf>
|
60
|
+
<Ustrd>Unstructured Remittance Information</Ustrd>
|
61
|
+
</RmtInf>
|
62
|
+
</CdtTrfTxInf>
|
63
|
+
<CdtTrfTxInf>
|
64
|
+
<PmtId>
|
65
|
+
<EndToEndId>OriginatorID1235</EndToEndId>
|
66
|
+
</PmtId>
|
67
|
+
<Amt>
|
68
|
+
<InstdAmt Ccy="EUR">112.72</InstdAmt>
|
69
|
+
</Amt>
|
70
|
+
<CdtrAgt>
|
71
|
+
<FinInstnId>
|
72
|
+
<BIC>SPUEDE2UXXX</BIC>
|
73
|
+
</FinInstnId>
|
74
|
+
</CdtrAgt>
|
75
|
+
<Cdtr>
|
76
|
+
<Nm>Other Creditor Name</Nm>
|
77
|
+
</Cdtr>
|
78
|
+
<CdtrAcct>
|
79
|
+
<Id>
|
80
|
+
<IBAN>DE21500500001234567897</IBAN>
|
81
|
+
</Id>
|
82
|
+
</CdtrAcct>
|
83
|
+
<RmtInf>
|
84
|
+
<Ustrd>Unstructured Remittance Information</Ustrd>
|
85
|
+
</RmtInf>
|
86
|
+
</CdtTrfTxInf>
|
87
|
+
</PmtInf>
|
88
|
+
</CstmrCdtTrfInitn>
|
89
|
+
</Document>
|
@@ -0,0 +1,134 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.002.02" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.008.002.02 pain.008.002.02.xsd">
|
3
|
+
<CstmrDrctDbtInitn>
|
4
|
+
<GrpHdr>
|
5
|
+
<MsgId>Message-ID</MsgId>
|
6
|
+
<CreDtTm>2010-11-21T09:30:47.000Z</CreDtTm>
|
7
|
+
<NbOfTxs>2</NbOfTxs>
|
8
|
+
<InitgPty>
|
9
|
+
<Nm>Initiator Name</Nm>
|
10
|
+
</InitgPty>
|
11
|
+
</GrpHdr>
|
12
|
+
<PmtInf>
|
13
|
+
<PmtInfId>Payment-ID</PmtInfId>
|
14
|
+
<PmtMtd>DD</PmtMtd>
|
15
|
+
<NbOfTxs>2</NbOfTxs>
|
16
|
+
<CtrlSum>6655.86</CtrlSum>
|
17
|
+
<PmtTpInf>
|
18
|
+
<SvcLvl>
|
19
|
+
<Cd>SEPA</Cd>
|
20
|
+
</SvcLvl>
|
21
|
+
<LclInstrm>
|
22
|
+
<Cd>CORE</Cd>
|
23
|
+
</LclInstrm>
|
24
|
+
<SeqTp>FRST</SeqTp>
|
25
|
+
</PmtTpInf>
|
26
|
+
<ReqdColltnDt>2010-12-03</ReqdColltnDt>
|
27
|
+
<Cdtr>
|
28
|
+
<Nm>Creditor Name</Nm>
|
29
|
+
</Cdtr>
|
30
|
+
<CdtrAcct>
|
31
|
+
<Id>
|
32
|
+
<IBAN>DE87200500001234567890</IBAN>
|
33
|
+
</Id>
|
34
|
+
</CdtrAcct>
|
35
|
+
<CdtrAgt>
|
36
|
+
<FinInstnId>
|
37
|
+
<BIC>BANKDEFFXXX</BIC>
|
38
|
+
</FinInstnId>
|
39
|
+
</CdtrAgt>
|
40
|
+
<ChrgBr>SLEV</ChrgBr>
|
41
|
+
<CdtrSchmeId>
|
42
|
+
<Id>
|
43
|
+
<PrvtId>
|
44
|
+
<Othr>
|
45
|
+
<Id>DE00ZZZ00099999999</Id>
|
46
|
+
<SchmeNm>
|
47
|
+
<Prtry>SEPA</Prtry>
|
48
|
+
</SchmeNm>
|
49
|
+
</Othr>
|
50
|
+
</PrvtId>
|
51
|
+
</Id>
|
52
|
+
</CdtrSchmeId>
|
53
|
+
<DrctDbtTxInf>
|
54
|
+
<PmtId>
|
55
|
+
<EndToEndId>OriginatorID1234</EndToEndId>
|
56
|
+
</PmtId>
|
57
|
+
<InstdAmt Ccy="EUR">6543.14</InstdAmt>
|
58
|
+
<DrctDbtTx>
|
59
|
+
<MndtRltdInf>
|
60
|
+
<MndtId>Mandate-Id</MndtId>
|
61
|
+
<DtOfSgntr>2010-11-20</DtOfSgntr>
|
62
|
+
<AmdmntInd>true</AmdmntInd>
|
63
|
+
<AmdmntInfDtls>
|
64
|
+
<OrgnlCdtrSchmeId>
|
65
|
+
<Nm>Original Creditor Name</Nm>
|
66
|
+
<Id>
|
67
|
+
<PrvtId>
|
68
|
+
<Othr>
|
69
|
+
<Id>AA00ZZZOriginalCreditorID</Id>
|
70
|
+
<SchmeNm>
|
71
|
+
<Prtry>SEPA</Prtry>
|
72
|
+
</SchmeNm>
|
73
|
+
</Othr>
|
74
|
+
</PrvtId>
|
75
|
+
</Id>
|
76
|
+
</OrgnlCdtrSchmeId>
|
77
|
+
</AmdmntInfDtls>
|
78
|
+
</MndtRltdInf>
|
79
|
+
</DrctDbtTx>
|
80
|
+
<DbtrAgt>
|
81
|
+
<FinInstnId>
|
82
|
+
<BIC>SPUEDE2UXXX</BIC>
|
83
|
+
</FinInstnId>
|
84
|
+
</DbtrAgt>
|
85
|
+
<Dbtr>
|
86
|
+
<Nm>Debtor Name</Nm>
|
87
|
+
</Dbtr>
|
88
|
+
<DbtrAcct>
|
89
|
+
<Id>
|
90
|
+
<IBAN>DE21500500009876543210</IBAN>
|
91
|
+
</Id>
|
92
|
+
</DbtrAcct>
|
93
|
+
<UltmtDbtr>
|
94
|
+
<Nm>Ultimate Debtor Name</Nm>
|
95
|
+
</UltmtDbtr>
|
96
|
+
<RmtInf>
|
97
|
+
<Ustrd>Unstructured Remittance Information</Ustrd>
|
98
|
+
</RmtInf>
|
99
|
+
</DrctDbtTxInf>
|
100
|
+
<DrctDbtTxInf>
|
101
|
+
<PmtId>
|
102
|
+
<EndToEndId>OriginatorID1235</EndToEndId>
|
103
|
+
</PmtId>
|
104
|
+
<InstdAmt Ccy="EUR">112.72</InstdAmt>
|
105
|
+
<DrctDbtTx>
|
106
|
+
<MndtRltdInf>
|
107
|
+
<MndtId>Other-Mandate-Id</MndtId>
|
108
|
+
<DtOfSgntr>2010-11-20</DtOfSgntr>
|
109
|
+
<AmdmntInd>false</AmdmntInd>
|
110
|
+
</MndtRltdInf>
|
111
|
+
</DrctDbtTx>
|
112
|
+
<DbtrAgt>
|
113
|
+
<FinInstnId>
|
114
|
+
<BIC>SPUEDE2UXXX</BIC>
|
115
|
+
</FinInstnId>
|
116
|
+
</DbtrAgt>
|
117
|
+
<Dbtr>
|
118
|
+
<Nm>Other Debtor Name</Nm>
|
119
|
+
</Dbtr>
|
120
|
+
<DbtrAcct>
|
121
|
+
<Id>
|
122
|
+
<IBAN>DE21500500001234567897</IBAN>
|
123
|
+
</Id>
|
124
|
+
</DbtrAcct>
|
125
|
+
<UltmtDbtr>
|
126
|
+
<Nm>Ultimate Debtor Name</Nm>
|
127
|
+
</UltmtDbtr>
|
128
|
+
<RmtInf>
|
129
|
+
<Ustrd>Unstructured Remittance Information</Ustrd>
|
130
|
+
</RmtInf>
|
131
|
+
</DrctDbtTxInf>
|
132
|
+
</PmtInf>
|
133
|
+
</CstmrDrctDbtInitn>
|
134
|
+
</Document>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe SEPA::Account do
|
5
|
+
it 'should initialize a new account' do
|
6
|
+
lambda{
|
7
|
+
SEPA::Account.new :name => 'Gläubiger GmbH',
|
8
|
+
:bic => 'BANKDEFFXXX',
|
9
|
+
:iban => 'DE87200500001234567890',
|
10
|
+
:identifier => 'DE98ZZZ09999999999'
|
11
|
+
}.should_not raise_error
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe SEPA::CreditTransaction do
|
5
|
+
it 'should initialize a new transaction' do
|
6
|
+
lambda{
|
7
|
+
SEPA::CreditTransaction.new :name => 'Telekomiker AG',
|
8
|
+
:iban => 'DE37112589611964645802',
|
9
|
+
:bic => 'PBNKDEFF370',
|
10
|
+
:amount => 102.50,
|
11
|
+
:reference => 'XYZ-1234/123',
|
12
|
+
:remittance_information => 'Rechnung 123 vom 22.08.2013'
|
13
|
+
}.should_not raise_error
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
describe SEPA::CreditTransferInitiation do
|
5
|
+
it 'should create valid XML file' do
|
6
|
+
cti = SEPA::CreditTransferInitiation.new :name => 'Schuldner GmbH',
|
7
|
+
:bic => 'BANKDEFFXXX',
|
8
|
+
:iban => 'DE87200500001234567890',
|
9
|
+
:identifier => 'DE98ZZZ09999999999'
|
10
|
+
|
11
|
+
cti.add_transaction :name => 'Telekomiker AG',
|
12
|
+
:iban => 'DE37112589611964645802',
|
13
|
+
:bic => 'PBNKDEFF370',
|
14
|
+
:amount => 102.50,
|
15
|
+
:reference => 'XYZ-1234/123',
|
16
|
+
:remittance_information => 'Rechnung vom 22.08.2013'
|
17
|
+
|
18
|
+
cti.add_transaction :name => 'Amazonas GmbH',
|
19
|
+
:iban => 'DE27793589132923472195',
|
20
|
+
:bic => 'TUBDDEDDXXX',
|
21
|
+
:amount => 59.00,
|
22
|
+
:reference => 'XYZ-5678/456',
|
23
|
+
:remittance_information => 'Rechnung om 21.08.2013'
|
24
|
+
|
25
|
+
XML::Document.string(cti.to_xml).should validate_against('pain.001.002.03.xsd')
|
26
|
+
end
|
27
|
+
end
|