sepa 0.0.8.1 → 0.0.9
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.
- data/README.md +32 -14
- data/lib/sepa/direct_debit_order.rb +12 -5
- data/lib/sepa/version.rb +1 -1
- data/spec/sepa/direct_debit_order_spec.rb +9 -6
- data/spec/sepa/expected_customer_direct_debit_initiation_v02.xml +8 -2
- data/spec/sepa/expected_customer_direct_debit_initiation_v04.xml +8 -2
- data/spec/sepa/expected_customer_direct_debit_initiation_v04_with_org_id.xml +8 -2
- metadata +2 -2
data/README.md
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
# Sepa
|
|
2
2
|
|
|
3
|
-
An implementation of pain.008.001
|
|
3
|
+
An implementation of pain.008.001 CustomerDirectDebitInitiation - versions 02 and 04. WARNING:
|
|
4
|
+
NO WARRANTY, USE AT YOUR OWN RISK AND PERIL. By using this software, you warrant and represent
|
|
5
|
+
and declare that having studied and examined and tested the source, you are satisfied, sure, and
|
|
6
|
+
certain that the version you use does exactly what you want it to do. This
|
|
4
7
|
|
|
5
|
-
|
|
8
|
+
MORE WARNING: This is alpha-quality software. The API is not yet stable. New versions will break
|
|
9
|
+
compatibility in unpredictable ways. Use at your own risk and peril.
|
|
10
|
+
|
|
11
|
+
ANOTHER WARNING: While I aim for ISO-20022 compatibility in all its glorious detail, this gem
|
|
12
|
+
implements only a subset of ISO-20022, and possibly does so incorrectly. On top of that, your
|
|
13
|
+
bank's interpretation of ISO-20022 may differ from mine, may require some fields that are
|
|
14
|
+
optional in the ISO specification, and may ignore some other fields that are mandatory in the
|
|
15
|
+
specification.
|
|
16
|
+
|
|
17
|
+
I wanted to make it as easy as possible to define message types and components so this library
|
|
18
|
+
will be easy to grow to implement the entire standard.
|
|
6
19
|
|
|
7
20
|
Implementations of other messages are welcome.
|
|
8
21
|
|
|
@@ -22,38 +35,43 @@ Or install it yourself as:
|
|
|
22
35
|
|
|
23
36
|
## Usage
|
|
24
37
|
|
|
25
|
-
The simplest way to generate a pain.008.001
|
|
26
|
-
is still a lot, but hey, this is a banking
|
|
38
|
+
The simplest way to generate a pain.008.001 xml message is to use the DirectDebitOrder module
|
|
39
|
+
which exposes only the bare essentials. Which is still a lot, but hey, this is a banking
|
|
40
|
+
standard, what do you expect.
|
|
27
41
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
42
|
+
Please see the spec for an up-to-date example of api usage. In the pseudo-ruby example below,
|
|
43
|
+
you need to supply a list of direct-debit objects, a creditor object, an initiator object, and
|
|
44
|
+
a message-id.
|
|
31
45
|
|
|
32
46
|
def create_sepa_direct_debit_order direct_debits, creditor, initiator, message_id
|
|
33
47
|
dd_list = []
|
|
34
48
|
|
|
35
49
|
# for each direct debit you want to order ...
|
|
36
50
|
|
|
37
|
-
for(each
|
|
38
|
-
bank_account = Sepa::DirectDebitOrder::BankAccount.new
|
|
39
|
-
debtor = Sepa::DirectDebitOrder::Party.new
|
|
40
|
-
|
|
51
|
+
for(each dd in direct_debits) do | ... |
|
|
52
|
+
bank_account = Sepa::DirectDebitOrder::BankAccount.new dd.iban, dd.bic
|
|
53
|
+
debtor = Sepa::DirectDebitOrder::Party.new dd.name, dd.addr, nil, dd.postcode, dd.town, dd.country, dd.contact, dd.phone, dd.email
|
|
54
|
+
mandate = Sepa::DirectDebitOrder::MandateInformation.new dd.mandate_id, dd.sig_date, dd.sequence_type
|
|
55
|
+
dd_list << Sepa::DirectDebitOrder::DirectDebit.new debtor, bank_account, dd.end_to_end_id, dd.amount, "EUR", mandate
|
|
41
56
|
end
|
|
42
57
|
|
|
43
58
|
creditor = Sepa::DirectDebitOrder::Party.new creditor.name, creditor.address, nil, creditor.postcode, creditor.town, creditor.country, creditor.contact, creditor.phone, creditor.email
|
|
44
59
|
|
|
45
60
|
creditor_account = Sepa::DirectDebitOrder::BankAccount.new creditor.iban, creditor.bic
|
|
46
61
|
|
|
47
|
-
|
|
62
|
+
sepa_identifier = Sepa::DirectDebitOrder::PrivateSepaIdentifier.new creditor.sepa_identifier
|
|
63
|
+
|
|
64
|
+
payment = Sepa::DirectDebitOrder::CreditorPayment.new creditor, creditor_account, payment_identifier, collection_date, sepa_identifier, dd_list
|
|
48
65
|
|
|
49
66
|
initiator = Sepa::DirectDebitOrder::Party.new initiator.identifier, initiator.address, nil, initiator.postcode, initiator.town, initiator.country, initiator.contact, initiator.phone, initiator.email
|
|
50
67
|
|
|
51
68
|
order = Sepa::DirectDebitOrder::Order.new message_id, initiator, [payment]
|
|
52
69
|
|
|
53
|
-
order.to_xml
|
|
70
|
+
order.to_xml pain_008_001_version: "04"
|
|
54
71
|
end
|
|
55
72
|
|
|
56
|
-
The last line returns a string that you will then need to send to your bank one way or another. For example, you might use an EBICS client.
|
|
73
|
+
The last line returns a string that you will then need to send to your bank one way or another. For example, you might use an EBICS client. Or your bank might provide
|
|
74
|
+
software to send the file. Or perhaps you can upload it via their website.
|
|
57
75
|
|
|
58
76
|
|
|
59
77
|
## Contributing
|
|
@@ -170,11 +170,17 @@ class Sepa::DirectDebitOrder
|
|
|
170
170
|
end
|
|
171
171
|
end
|
|
172
172
|
|
|
173
|
+
class MandateInformation < Struct.new(:identification, :signature_date, :sequence_type); end
|
|
174
|
+
|
|
173
175
|
class DirectDebit
|
|
174
|
-
attr_accessor :debtor, :debtor_account, :end_to_end_id, :amount, :currency, :
|
|
176
|
+
attr_accessor :debtor, :debtor_account, :end_to_end_id, :amount, :currency, :mandate_info
|
|
177
|
+
|
|
178
|
+
def initialize debtor, debtor_account, end_to_end_id, amount, currency, mandate_info
|
|
179
|
+
@debtor, @debtor_account, @end_to_end_id, @amount, @currency, @mandate_info = debtor, debtor_account, end_to_end_id, amount, currency, mandate_info
|
|
180
|
+
end
|
|
175
181
|
|
|
176
|
-
def
|
|
177
|
-
|
|
182
|
+
def sequence_type
|
|
183
|
+
mandate_info.sequence_type
|
|
178
184
|
end
|
|
179
185
|
|
|
180
186
|
def to_properties prefix, opts
|
|
@@ -182,13 +188,14 @@ class Sepa::DirectDebitOrder
|
|
|
182
188
|
"#{prefix}.payment_identification.end_to_end_identification" => end_to_end_id,
|
|
183
189
|
"#{prefix}.instructed_amount" => ("%.2f" % amount),
|
|
184
190
|
"#{prefix}.instructed_amount_currency" => "EUR",
|
|
185
|
-
"#{prefix}.direct_debit_transaction.mandate_related_information.mandate_identification" =>
|
|
191
|
+
"#{prefix}.direct_debit_transaction.mandate_related_information.mandate_identification" => mandate_info.identification,
|
|
192
|
+
"#{prefix}.direct_debit_transaction.mandate_related_information.date_of_signature" => mandate_info.signature_date
|
|
186
193
|
}
|
|
187
194
|
hsh = hsh.merge debtor.to_properties("#{prefix}.debtor", opts)
|
|
188
195
|
hsh = hsh.merge debtor_account.to_properties("#{prefix}.debtor", opts)
|
|
189
196
|
|
|
190
197
|
if opts[:pain_008_001_version] == "04"
|
|
191
|
-
hsh["#{prefix}.payment_type_information.sequence_type"] = sequence_type
|
|
198
|
+
hsh["#{prefix}.payment_type_information.sequence_type"] = mandate_info.sequence_type
|
|
192
199
|
end
|
|
193
200
|
|
|
194
201
|
hsh
|
data/lib/sepa/version.rb
CHANGED
|
@@ -8,18 +8,21 @@ describe Sepa::DirectDebitOrder do
|
|
|
8
8
|
def order sepa_identifier_class
|
|
9
9
|
bank_account0 = Sepa::DirectDebitOrder::BankAccount.new "FRZIZIPAPARAZZI345789", "FRZZPPKOOKOO"
|
|
10
10
|
debtor0 = Sepa::DirectDebitOrder::Party.new "DALTON/CONANMR", "64, Livva de Getamire", nil, "30005", "RENNES", "FR", "Conan DALTON", "01234567890", "conan@dalton.sepa.i.hope.this.works"
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
mandate0 = Sepa::DirectDebitOrder::MandateInformation.new("mandate-id-0", Date.parse("2010-11-18"), "RCUR")
|
|
12
|
+
dd00 = Sepa::DirectDebitOrder::DirectDebit.new debtor0, bank_account0, "MONECOLE REG F13789 PVT 3", 1231.31, "EUR", mandate0
|
|
13
|
+
dd01 = Sepa::DirectDebitOrder::DirectDebit.new debtor0, bank_account0, "MONECOLE REG F13791 PVT 3", 1133.33, "EUR", mandate0
|
|
13
14
|
|
|
14
15
|
bank_account1 = Sepa::DirectDebitOrder::BankAccount.new "FRQUIQUIWIGWAM947551", "FRQQWIGGA"
|
|
15
16
|
debtor1 = Sepa::DirectDebitOrder::Party.new "ADAMS/SAMUELMR", "256, Livva de Getamire", nil, "75048", "PARIS", "FR", "Samuel ADAMS", "09876543210", "samuel@adams.sepa.i.hope.this.works"
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
mandate1 = Sepa::DirectDebitOrder::MandateInformation.new("mandate-id-1", Date.parse("2012-01-19"), "FRST")
|
|
18
|
+
dd10 = Sepa::DirectDebitOrder::DirectDebit.new debtor1, bank_account1, "MONECOLE REG F13790 PVT 3", 1732.32, "EUR", mandate1
|
|
19
|
+
dd11 = Sepa::DirectDebitOrder::DirectDebit.new debtor1, bank_account1, "MONECOLE REG F13792 PVT 3", 1034.34, "EUR", mandate1
|
|
18
20
|
|
|
19
21
|
bank_account2 = Sepa::DirectDebitOrder::BankAccount.new "FRQUIQUIWIGWAM947551", "FRQQWIGGA"
|
|
20
22
|
debtor2 = Sepa::DirectDebitOrder::Party.new "ADAMS/SAMUELMR", "512, Livva de Meet Agir", nil, "75099", "PARIS", "FR", "Johann S. BACH", "09876543210", "js@bach.sepa.i.hope.this.works"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
mandate2 = Sepa::DirectDebitOrder::MandateInformation.new("mandate-id-2", Date.parse("2013-06-08"), "RCUR")
|
|
24
|
+
dd20 = Sepa::DirectDebitOrder::DirectDebit.new debtor2, bank_account2, "MONECOLE REG F13793 PVT 3", 1935.35, "EUR", mandate2
|
|
25
|
+
dd21 = Sepa::DirectDebitOrder::DirectDebit.new debtor2, bank_account2, "MONECOLE REG F13794 PVT 3", 1236.36, "EUR", mandate2
|
|
23
26
|
|
|
24
27
|
sepa_now = Time.strptime "1992-02-28T18:30:00", "%Y-%m-%dT%H:%M:%S"
|
|
25
28
|
Time.stub(:now).and_return sepa_now
|
|
@@ -81,6 +81,7 @@
|
|
|
81
81
|
<DrctDbtTx>
|
|
82
82
|
<MndtRltdInf>
|
|
83
83
|
<MndtId>mandate-id-1</MndtId>
|
|
84
|
+
<DtOfSgntr>2012-01-19</DtOfSgntr>
|
|
84
85
|
</MndtRltdInf>
|
|
85
86
|
</DrctDbtTx>
|
|
86
87
|
<DbtrAgt>
|
|
@@ -116,6 +117,7 @@
|
|
|
116
117
|
<DrctDbtTx>
|
|
117
118
|
<MndtRltdInf>
|
|
118
119
|
<MndtId>mandate-id-1</MndtId>
|
|
120
|
+
<DtOfSgntr>2012-01-19</DtOfSgntr>
|
|
119
121
|
</MndtRltdInf>
|
|
120
122
|
</DrctDbtTx>
|
|
121
123
|
<DbtrAgt>
|
|
@@ -204,6 +206,7 @@
|
|
|
204
206
|
<DrctDbtTx>
|
|
205
207
|
<MndtRltdInf>
|
|
206
208
|
<MndtId>mandate-id-0</MndtId>
|
|
209
|
+
<DtOfSgntr>2010-11-18</DtOfSgntr>
|
|
207
210
|
</MndtRltdInf>
|
|
208
211
|
</DrctDbtTx>
|
|
209
212
|
<DbtrAgt>
|
|
@@ -239,6 +242,7 @@
|
|
|
239
242
|
<DrctDbtTx>
|
|
240
243
|
<MndtRltdInf>
|
|
241
244
|
<MndtId>mandate-id-0</MndtId>
|
|
245
|
+
<DtOfSgntr>2010-11-18</DtOfSgntr>
|
|
242
246
|
</MndtRltdInf>
|
|
243
247
|
</DrctDbtTx>
|
|
244
248
|
<DbtrAgt>
|
|
@@ -273,7 +277,8 @@
|
|
|
273
277
|
<InstdAmt Ccy="EUR">1935.35</InstdAmt>
|
|
274
278
|
<DrctDbtTx>
|
|
275
279
|
<MndtRltdInf>
|
|
276
|
-
<MndtId>mandate-id-
|
|
280
|
+
<MndtId>mandate-id-2</MndtId>
|
|
281
|
+
<DtOfSgntr>2013-06-08</DtOfSgntr>
|
|
277
282
|
</MndtRltdInf>
|
|
278
283
|
</DrctDbtTx>
|
|
279
284
|
<DbtrAgt>
|
|
@@ -308,7 +313,8 @@
|
|
|
308
313
|
<InstdAmt Ccy="EUR">1236.36</InstdAmt>
|
|
309
314
|
<DrctDbtTx>
|
|
310
315
|
<MndtRltdInf>
|
|
311
|
-
<MndtId>mandate-id-
|
|
316
|
+
<MndtId>mandate-id-2</MndtId>
|
|
317
|
+
<DtOfSgntr>2013-06-08</DtOfSgntr>
|
|
312
318
|
</MndtRltdInf>
|
|
313
319
|
</DrctDbtTx>
|
|
314
320
|
<DbtrAgt>
|
|
@@ -83,6 +83,7 @@
|
|
|
83
83
|
<DrctDbtTx>
|
|
84
84
|
<MndtRltdInf>
|
|
85
85
|
<MndtId>mandate-id-0</MndtId>
|
|
86
|
+
<DtOfSgntr>2010-11-18</DtOfSgntr>
|
|
86
87
|
</MndtRltdInf>
|
|
87
88
|
</DrctDbtTx>
|
|
88
89
|
<DbtrAgt>
|
|
@@ -121,6 +122,7 @@
|
|
|
121
122
|
<DrctDbtTx>
|
|
122
123
|
<MndtRltdInf>
|
|
123
124
|
<MndtId>mandate-id-0</MndtId>
|
|
125
|
+
<DtOfSgntr>2010-11-18</DtOfSgntr>
|
|
124
126
|
</MndtRltdInf>
|
|
125
127
|
</DrctDbtTx>
|
|
126
128
|
<DbtrAgt>
|
|
@@ -159,6 +161,7 @@
|
|
|
159
161
|
<DrctDbtTx>
|
|
160
162
|
<MndtRltdInf>
|
|
161
163
|
<MndtId>mandate-id-1</MndtId>
|
|
164
|
+
<DtOfSgntr>2012-01-19</DtOfSgntr>
|
|
162
165
|
</MndtRltdInf>
|
|
163
166
|
</DrctDbtTx>
|
|
164
167
|
<DbtrAgt>
|
|
@@ -197,6 +200,7 @@
|
|
|
197
200
|
<DrctDbtTx>
|
|
198
201
|
<MndtRltdInf>
|
|
199
202
|
<MndtId>mandate-id-1</MndtId>
|
|
203
|
+
<DtOfSgntr>2012-01-19</DtOfSgntr>
|
|
200
204
|
</MndtRltdInf>
|
|
201
205
|
</DrctDbtTx>
|
|
202
206
|
<DbtrAgt>
|
|
@@ -234,7 +238,8 @@
|
|
|
234
238
|
<InstdAmt Ccy="EUR">1935.35</InstdAmt>
|
|
235
239
|
<DrctDbtTx>
|
|
236
240
|
<MndtRltdInf>
|
|
237
|
-
<MndtId>mandate-id-
|
|
241
|
+
<MndtId>mandate-id-2</MndtId>
|
|
242
|
+
<DtOfSgntr>2013-06-08</DtOfSgntr>
|
|
238
243
|
</MndtRltdInf>
|
|
239
244
|
</DrctDbtTx>
|
|
240
245
|
<DbtrAgt>
|
|
@@ -272,7 +277,8 @@
|
|
|
272
277
|
<InstdAmt Ccy="EUR">1236.36</InstdAmt>
|
|
273
278
|
<DrctDbtTx>
|
|
274
279
|
<MndtRltdInf>
|
|
275
|
-
<MndtId>mandate-id-
|
|
280
|
+
<MndtId>mandate-id-2</MndtId>
|
|
281
|
+
<DtOfSgntr>2013-06-08</DtOfSgntr>
|
|
276
282
|
</MndtRltdInf>
|
|
277
283
|
</DrctDbtTx>
|
|
278
284
|
<DbtrAgt>
|
|
@@ -83,6 +83,7 @@
|
|
|
83
83
|
<DrctDbtTx>
|
|
84
84
|
<MndtRltdInf>
|
|
85
85
|
<MndtId>mandate-id-0</MndtId>
|
|
86
|
+
<DtOfSgntr>2010-11-18</DtOfSgntr>
|
|
86
87
|
</MndtRltdInf>
|
|
87
88
|
</DrctDbtTx>
|
|
88
89
|
<DbtrAgt>
|
|
@@ -121,6 +122,7 @@
|
|
|
121
122
|
<DrctDbtTx>
|
|
122
123
|
<MndtRltdInf>
|
|
123
124
|
<MndtId>mandate-id-0</MndtId>
|
|
125
|
+
<DtOfSgntr>2010-11-18</DtOfSgntr>
|
|
124
126
|
</MndtRltdInf>
|
|
125
127
|
</DrctDbtTx>
|
|
126
128
|
<DbtrAgt>
|
|
@@ -159,6 +161,7 @@
|
|
|
159
161
|
<DrctDbtTx>
|
|
160
162
|
<MndtRltdInf>
|
|
161
163
|
<MndtId>mandate-id-1</MndtId>
|
|
164
|
+
<DtOfSgntr>2012-01-19</DtOfSgntr>
|
|
162
165
|
</MndtRltdInf>
|
|
163
166
|
</DrctDbtTx>
|
|
164
167
|
<DbtrAgt>
|
|
@@ -197,6 +200,7 @@
|
|
|
197
200
|
<DrctDbtTx>
|
|
198
201
|
<MndtRltdInf>
|
|
199
202
|
<MndtId>mandate-id-1</MndtId>
|
|
203
|
+
<DtOfSgntr>2012-01-19</DtOfSgntr>
|
|
200
204
|
</MndtRltdInf>
|
|
201
205
|
</DrctDbtTx>
|
|
202
206
|
<DbtrAgt>
|
|
@@ -234,7 +238,8 @@
|
|
|
234
238
|
<InstdAmt Ccy="EUR">1935.35</InstdAmt>
|
|
235
239
|
<DrctDbtTx>
|
|
236
240
|
<MndtRltdInf>
|
|
237
|
-
<MndtId>mandate-id-
|
|
241
|
+
<MndtId>mandate-id-2</MndtId>
|
|
242
|
+
<DtOfSgntr>2013-06-08</DtOfSgntr>
|
|
238
243
|
</MndtRltdInf>
|
|
239
244
|
</DrctDbtTx>
|
|
240
245
|
<DbtrAgt>
|
|
@@ -272,7 +277,8 @@
|
|
|
272
277
|
<InstdAmt Ccy="EUR">1236.36</InstdAmt>
|
|
273
278
|
<DrctDbtTx>
|
|
274
279
|
<MndtRltdInf>
|
|
275
|
-
<MndtId>mandate-id-
|
|
280
|
+
<MndtId>mandate-id-2</MndtId>
|
|
281
|
+
<DtOfSgntr>2013-06-08</DtOfSgntr>
|
|
276
282
|
</MndtRltdInf>
|
|
277
283
|
</DrctDbtTx>
|
|
278
284
|
<DbtrAgt>
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: sepa
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.
|
|
4
|
+
version: 0.0.9
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2013-11-
|
|
12
|
+
date: 2013-11-12 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: builder
|