sepa 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +61 -0
- data/Rakefile +1 -0
- data/lib/sepa.rb +10 -0
- data/lib/sepa/base.rb +82 -0
- data/lib/sepa/direct_debit_order.rb +124 -0
- data/lib/sepa/payments_initiation.rb +14 -0
- data/lib/sepa/payments_initiation/account_identification_choice.rb +7 -0
- data/lib/sepa/payments_initiation/account_scheme_name_choice.rb +4 -0
- data/lib/sepa/payments_initiation/authorisation.rb +3 -0
- data/lib/sepa/payments_initiation/branch_and_financial_institution_identification.rb +6 -0
- data/lib/sepa/payments_initiation/cash_account.rb +8 -0
- data/lib/sepa/payments_initiation/cash_account_type_choice.rb +2 -0
- data/lib/sepa/payments_initiation/category_purpose_choice.rb +3 -0
- data/lib/sepa/payments_initiation/contact_details.rb +9 -0
- data/lib/sepa/payments_initiation/financial_institution_identification.rb +9 -0
- data/lib/sepa/payments_initiation/generic_account_identification.rb +8 -0
- data/lib/sepa/payments_initiation/local_instrument_choice.rb +3 -0
- data/lib/sepa/payments_initiation/pain00800104/customer_direct_debit_initiation.rb +17 -0
- data/lib/sepa/payments_initiation/pain00800104/direct_debit_transaction.rb +4 -0
- data/lib/sepa/payments_initiation/pain00800104/direct_debit_transaction_information.rb +25 -0
- data/lib/sepa/payments_initiation/pain00800104/group_header.rb +10 -0
- data/lib/sepa/payments_initiation/pain00800104/payment_identification.rb +5 -0
- data/lib/sepa/payments_initiation/pain00800104/payment_information.rb +22 -0
- data/lib/sepa/payments_initiation/pain00800104/payment_type_information.rb +11 -0
- data/lib/sepa/payments_initiation/pain00800104/purpose_choice.rb +4 -0
- data/lib/sepa/payments_initiation/pain00800104/regulatory_authority.rb +5 -0
- data/lib/sepa/payments_initiation/pain00800104/regulatory_reporting.rb +9 -0
- data/lib/sepa/payments_initiation/pain00800104/service_level_choice.rb +3 -0
- data/lib/sepa/payments_initiation/pain00800104/structured_regulatory_reporting.rb +9 -0
- data/lib/sepa/payments_initiation/pain00800104/tax_authorisation.rb +5 -0
- data/lib/sepa/payments_initiation/pain00800104/tax_information.rb +7 -0
- data/lib/sepa/payments_initiation/pain00800104/tax_party.rb +7 -0
- data/lib/sepa/payments_initiation/party_choice_identification.rb +2 -0
- data/lib/sepa/payments_initiation/party_identification.rb +12 -0
- data/lib/sepa/payments_initiation/postal_address.rb +13 -0
- data/lib/sepa/version.rb +3 -0
- data/sepa.gemspec +25 -0
- data/spec/sepa/direct_debit_order_spec.rb +33 -0
- data/spec/sepa/direct_debit_properties.yml +42 -0
- data/spec/sepa/expected_customer_direct_debit_initiation.xml +113 -0
- data/spec/sepa/payments_initiation/pain00800104/customer_direct_debit_initiation_spec.rb +66 -0
- data/spec/spec_helper.rb +7 -0
- metadata +145 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 conanite
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
# Sepa
|
2
|
+
|
3
|
+
An implementation of pain.008.001.04 CustomerDirectDebitInitiation.
|
4
|
+
|
5
|
+
I wanted to make it as easy as possible to define message types and components so this library will be easy to grow to implement the entire standard.
|
6
|
+
|
7
|
+
Implementations of other messages are welcome.
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
Add this line to your application's Gemfile:
|
12
|
+
|
13
|
+
gem 'sepa'
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install sepa
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
The simplest way to generate a pain.008.001.04 xml message is to use the DirectDebitOrder module which exposes only the bare essentials. Which is still a lot, but hey, this is a banking standard, what do you expect.
|
26
|
+
|
27
|
+
Here's an example, ripped off from the spec, of a direct debit order for payments to a single creditor -
|
28
|
+
|
29
|
+
direct_debits = []
|
30
|
+
|
31
|
+
# for each direct debit you want to order ...
|
32
|
+
|
33
|
+
for(each direct debit) do | ... |
|
34
|
+
bank_account = Sepa::DirectDebitOrder::BankAccount.new iban, bic
|
35
|
+
debtor = Sepa::DirectDebitOrder::Party.new name, addr, nil, postcode, town, country, contact, phone, email
|
36
|
+
direct_debits << Sepa::DirectDebitOrder::DirectDebit.new debtor, bank_account, end_to_end_id, amount, "EUR"
|
37
|
+
end
|
38
|
+
|
39
|
+
creditor = Sepa::DirectDebitOrder::Party.new creditor_name, creditor_addr, nil, creditor_postcode, creditor_town, creditor_country, creditor_contact, creditor_phone, creditor_email
|
40
|
+
|
41
|
+
creditor_account = Sepa::DirectDebitOrder::BankAccount.new creditor_iban, creditor_bic
|
42
|
+
payment = Sepa::DirectDebitOrder::CreditorPayment.new creditor, creditor_account, payment_identifier, collection_date, direct_debits
|
43
|
+
|
44
|
+
initiator = Sepa::DirectDebitOrder::Party.new initiator, initiator_addr, nil, initiator_postcode, initiator_town, initiator_country, initiator_contact, initiator_phone, initiator_email
|
45
|
+
|
46
|
+
order = Sepa::DirectDebitOrder::Order.new message_identifier, initiator, [payment]
|
47
|
+
|
48
|
+
order.to_xml
|
49
|
+
|
50
|
+
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.
|
51
|
+
|
52
|
+
|
53
|
+
## Contributing
|
54
|
+
|
55
|
+
Other message types are totally welcome.
|
56
|
+
|
57
|
+
1. Fork it
|
58
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
59
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
60
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
61
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/sepa.rb
ADDED
data/lib/sepa/base.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
module Sepa
|
2
|
+
class Base
|
3
|
+
include Aduki::Initializer
|
4
|
+
|
5
|
+
@@attribute_defs = Hash.new { |h,k| h[k] = { } }
|
6
|
+
|
7
|
+
def build_xml_attributes names
|
8
|
+
result = { }
|
9
|
+
(names || { }).each { |k,v|
|
10
|
+
result[k] = self.send v
|
11
|
+
}
|
12
|
+
result
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_xml builder
|
16
|
+
self.class.attribute_defs.each do |name, meta|
|
17
|
+
item = self.send(name)
|
18
|
+
options = meta[:options] || { }
|
19
|
+
attributes = build_xml_attributes options[:attributes]
|
20
|
+
next if item == nil
|
21
|
+
if meta[:type] == :string
|
22
|
+
builder.__send__(meta[:tag], item, attributes)
|
23
|
+
elsif meta[:type] == :[]
|
24
|
+
if meta[:member_type] == nil
|
25
|
+
item.each { |obj| builder.__send__(meta[:tag], obj, attributes) }
|
26
|
+
else
|
27
|
+
item.each do |obj|
|
28
|
+
builder.__send__(meta[:tag], attributes) { obj.to_xml builder }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
elsif meta[:type] == Time
|
32
|
+
v = item.is_a?(String) ? item : item.strftime("%Y-%m-%dT%H:%M:%S")
|
33
|
+
builder.__send__(meta[:tag], v, attributes)
|
34
|
+
elsif meta[:type] == Date
|
35
|
+
v = item.is_a?(String) ? item : item.strftime("%Y-%m-%d")
|
36
|
+
builder.__send__(meta[:tag], v, attributes)
|
37
|
+
elsif meta[:type].is_a? Class
|
38
|
+
builder.__send__(meta[:tag], attributes) { item.to_xml builder }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.attribute_defs
|
44
|
+
@@attribute_defs[self]
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.attribute_defs= arg
|
48
|
+
@@attribute_defs[self]= arg
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.definition txt
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.code_or_proprietary
|
55
|
+
attribute :code , "Cd"
|
56
|
+
attribute :proprietary, "Prtry"
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.attribute name, tag, type=:string, member_type=nil, options={ }
|
60
|
+
if type == :[]
|
61
|
+
array_attribute name, tag, member_type, options
|
62
|
+
elsif type.is_a?(Class) && type != Time && type != Date
|
63
|
+
typed_attribute name, tag, type, options
|
64
|
+
else
|
65
|
+
attr_accessor name
|
66
|
+
attribute_defs[name] = { :tag => tag, :type => type, :options => options }
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.typed_attribute name, tag, type, options
|
71
|
+
attribute_defs[name] = { :tag => tag, :type => type, :options => options }
|
72
|
+
attr_accessor name
|
73
|
+
aduki name => type
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.array_attribute name, tag, member_type=nil, options={ }
|
77
|
+
attribute_defs[name] = { :tag => tag, :type => :[], :member_type => member_type, :options => options }
|
78
|
+
attr_accessor name
|
79
|
+
aduki(name => member_type) if member_type
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
class Sepa::DirectDebitOrder
|
4
|
+
|
5
|
+
class Order
|
6
|
+
attr_accessor :message_id, :initiating_party, :creditor_payments
|
7
|
+
|
8
|
+
def initialize message_id, initiating_party, creditor_payments
|
9
|
+
@message_id, @initiating_party, @creditor_payments = message_id, initiating_party, creditor_payments
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_properties
|
13
|
+
hsh = {
|
14
|
+
"group_header.message_identification" => message_id,
|
15
|
+
"group_header.creation_date_time" => Time.now,
|
16
|
+
"group_header.number_of_transactions" => creditor_payments.inject(0) { |sum, cp| sum + cp.number_of_transactions },
|
17
|
+
}
|
18
|
+
|
19
|
+
hsh = hsh.merge initiating_party.to_properties("group_header.initiating_party")
|
20
|
+
|
21
|
+
creditor_payments.each_with_index { |cp, i|
|
22
|
+
hsh = hsh.merge(cp.to_properties("payment_information[#{i}]"))
|
23
|
+
}
|
24
|
+
|
25
|
+
hsh
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_xml
|
29
|
+
Sepa::PaymentsInitiation::Pain00800104::CustomerDirectDebitInitiation.new(to_properties).generate_xml
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Party
|
34
|
+
attr_accessor :name, :address_line_1, :address_line_2, :postcode, :town, :country, :contact_name, :contact_phone, :contact_email
|
35
|
+
|
36
|
+
def initialize name, address_line_1, address_line_2, postcode, town, country, contact_name, contact_phone, contact_email
|
37
|
+
@name, @address_line_1, @address_line_2, @postcode, @town, @country = name, address_line_1, address_line_2, postcode, town, country
|
38
|
+
@contact_name, @contact_phone, @contact_email = contact_name, contact_phone, contact_email
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_properties prefix
|
42
|
+
hsh = {
|
43
|
+
"#{prefix}.name" => name,
|
44
|
+
"#{prefix}.postal_address.address_line[0]" => address_line_1,
|
45
|
+
"#{prefix}.postal_address.post_code" => postcode,
|
46
|
+
"#{prefix}.postal_address.town_name" => town,
|
47
|
+
"#{prefix}.postal_address.country" => country,
|
48
|
+
"#{prefix}.contact_details.name" => contact_name,
|
49
|
+
"#{prefix}.contact_details.phone_number" => contact_phone,
|
50
|
+
"#{prefix}.contact_details.email_address" => contact_email,
|
51
|
+
}
|
52
|
+
|
53
|
+
hsh["#{prefix}.postal_address.address_line[1]"] = address_line_2 if address_line_2
|
54
|
+
|
55
|
+
hsh
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
class CreditorPayment
|
60
|
+
attr_accessor :creditor, :creditor_account, :id, :collection_date
|
61
|
+
attr_accessor :direct_debits
|
62
|
+
|
63
|
+
def initialize creditor, creditor_account, id, collection_date, direct_debits
|
64
|
+
@creditor, @creditor_account = creditor, creditor_account
|
65
|
+
@id, @collection_date = id, collection_date
|
66
|
+
@direct_debits = direct_debits
|
67
|
+
end
|
68
|
+
|
69
|
+
def number_of_transactions
|
70
|
+
direct_debits.length
|
71
|
+
end
|
72
|
+
|
73
|
+
def to_properties prefix
|
74
|
+
hsh = {
|
75
|
+
"#{prefix}.payment_information_identification" => id,
|
76
|
+
"#{prefix}.payment_method" => "DD",
|
77
|
+
"#{prefix}.requested_collection_date" => collection_date
|
78
|
+
}
|
79
|
+
|
80
|
+
hsh = hsh.merge creditor.to_properties("#{prefix}.creditor")
|
81
|
+
hsh = hsh.merge creditor_account.to_properties("#{prefix}.creditor")
|
82
|
+
|
83
|
+
direct_debits.each_with_index { |dd, j|
|
84
|
+
hsh = hsh.merge(dd.to_properties("#{prefix}.direct_debit_transaction_information[#{j}]"))
|
85
|
+
}
|
86
|
+
|
87
|
+
hsh
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
class BankAccount
|
92
|
+
attr_accessor :iban, :swift
|
93
|
+
|
94
|
+
def initialize iban, swift
|
95
|
+
@iban, @swift = iban, swift
|
96
|
+
end
|
97
|
+
|
98
|
+
def to_properties prefix
|
99
|
+
{ "#{prefix}_account.identification.iban" => iban,
|
100
|
+
"#{prefix}_agent.financial_institution_identification.bic_fi" => swift }
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
class DirectDebit
|
105
|
+
attr_accessor :debtor, :debtor_account, :end_to_end_id, :amount, :currency
|
106
|
+
|
107
|
+
def initialize debtor, debtor_account, end_to_end_id, amount, currency
|
108
|
+
@debtor, @debtor_account, @end_to_end_id, @amount, @currency = debtor, debtor_account, end_to_end_id, amount, currency
|
109
|
+
end
|
110
|
+
|
111
|
+
def to_properties prefix
|
112
|
+
hsh = {
|
113
|
+
"#{prefix}.payment_identification.end_to_end_identification" => end_to_end_id,
|
114
|
+
"#{prefix}.instructed_amount" => ("%.2f" % amount),
|
115
|
+
"#{prefix}.instructed_amount_currency" => "EUR",
|
116
|
+
}
|
117
|
+
hsh = hsh.merge debtor.to_properties("#{prefix}.debtor")
|
118
|
+
hsh = hsh.merge debtor_account.to_properties("#{prefix}.debtor")
|
119
|
+
hsh
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Sepa
|
2
|
+
module PaymentsInitiation
|
3
|
+
module Pain00800104
|
4
|
+
end
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
Dir["lib/sepa/payments_initiation/*.rb"].each do |f|
|
9
|
+
require f.gsub("lib/", "")
|
10
|
+
end
|
11
|
+
|
12
|
+
Dir["lib/sepa/payments_initiation/pain00800104/**/*.rb"].each do |f|
|
13
|
+
require f.gsub("lib/", "")
|
14
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
require "sepa/payments_initiation/generic_account_identification"
|
2
|
+
|
3
|
+
class Sepa::PaymentsInitiation::AccountIdentificationChoice < Sepa::Base
|
4
|
+
definition "Specifies the unique identification of an account as assigned by the account servicer."
|
5
|
+
attribute :iban, "IBAN"
|
6
|
+
attribute :other, "Othr", Sepa::PaymentsInitiation::GenericAccountIdentification
|
7
|
+
end
|
@@ -0,0 +1,6 @@
|
|
1
|
+
require "sepa/payments_initiation/financial_institution_identification"
|
2
|
+
|
3
|
+
class Sepa::PaymentsInitiation::BranchAndFinancialInstitutionIdentification < Sepa::Base
|
4
|
+
definition "Set of elements used to uniquely and unambiguously identify a financial institution or a branch of a financial institution."
|
5
|
+
attribute :financial_institution_identification, "FinInstnId", Sepa::PaymentsInitiation::FinancialInstitutionIdentification
|
6
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
require "sepa/payments_initiation/cash_account_type_choice"
|
2
|
+
|
3
|
+
class Sepa::PaymentsInitiation::CashAccount < Sepa::Base
|
4
|
+
attribute :identification, "Id", Sepa::PaymentsInitiation::AccountIdentificationChoice
|
5
|
+
attribute :type, "Tp", Sepa::PaymentsInitiation::CashAccountTypeChoice
|
6
|
+
attribute :currency, "Ccy"
|
7
|
+
attribute :name, "Nm"
|
8
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class Sepa::PaymentsInitiation::ContactDetails < Sepa::Base
|
2
|
+
attribute :name_prefix , "NmPrfx"
|
3
|
+
attribute :name , "Nm"
|
4
|
+
attribute :phone_number , "PhneNb"
|
5
|
+
attribute :mobile_number, "MobNb"
|
6
|
+
attribute :fax_number , "FaxNb"
|
7
|
+
attribute :email_address, "EmailAdr"
|
8
|
+
attribute :other , "Othr"
|
9
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require "sepa/payments_initiation/postal_address"
|
2
|
+
|
3
|
+
class Sepa::PaymentsInitiation::FinancialInstitutionIdentification < Sepa::Base
|
4
|
+
definition "Unique and unambiguous identification of a financial institution, as assigned under an internationally recognised or proprietary identification scheme."
|
5
|
+
attribute :bic_fi, "BICFI"
|
6
|
+
attribute :name, "Nm"
|
7
|
+
attribute :postal_address, "PstlAdr", Sepa::PaymentsInitiation::PostalAddress
|
8
|
+
|
9
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
require "sepa/payments_initiation/account_scheme_name_choice"
|
2
|
+
|
3
|
+
class Sepa::PaymentsInitiation::GenericAccountIdentification < Sepa::Base
|
4
|
+
definition "Unique identification of an account, as assigned by the account servicer, using an identification scheme."
|
5
|
+
attribute :identification, "Id"
|
6
|
+
attribute :scheme_name , "SchmeNm", Sepa::PaymentsInitiation::AccountSchemeNameChoice
|
7
|
+
attribute :issuer , "Issr"
|
8
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "sepa/payments_initiation/pain00800104/group_header"
|
2
|
+
require "sepa/payments_initiation/pain00800104/payment_information"
|
3
|
+
|
4
|
+
class Sepa::PaymentsInitiation::Pain00800104::CustomerDirectDebitInitiation < Sepa::Base
|
5
|
+
attribute :group_header , "GrpHdr", Sepa::PaymentsInitiation::Pain00800104::GroupHeader
|
6
|
+
attribute :payment_information , "PmtInf", :[], Sepa::PaymentsInitiation::Pain00800104::PaymentInformation
|
7
|
+
|
8
|
+
def generate_xml
|
9
|
+
builder = Builder::XmlMarkup.new(:indent => 2)
|
10
|
+
builder.instruct!
|
11
|
+
builder.Document(:xmlns=>"urn:iso:std:iso:20022:tech:xsd:pain.008.001.04", :"xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance", :"xsi:schemaLocation"=>"urn:iso:std:iso:20022:tech:xsd:pain.008.001.04 pain.008.001.04.xsd") {
|
12
|
+
builder.CstmrDrctDbtInitn {
|
13
|
+
self.to_xml builder
|
14
|
+
}
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "sepa/payments_initiation/pain00800104/payment_identification"
|
2
|
+
require "sepa/payments_initiation/pain00800104/payment_type_information"
|
3
|
+
require "sepa/payments_initiation/pain00800104/direct_debit_transaction"
|
4
|
+
require "sepa/payments_initiation/pain00800104/purpose_choice"
|
5
|
+
require "sepa/payments_initiation/pain00800104/regulatory_reporting"
|
6
|
+
|
7
|
+
class Sepa::PaymentsInitiation::Pain00800104::DirectDebitTransactionInformation < Sepa::Base
|
8
|
+
definition "Provides information on the individual transaction(s) included in the message."
|
9
|
+
attribute :payment_identification , "PmtId" , Sepa::PaymentsInitiation::Pain00800104::PaymentIdentification
|
10
|
+
attribute :payment_type_information , "PmtTpInf" , Sepa::PaymentsInitiation::Pain00800104::PaymentTypeInformation
|
11
|
+
attribute :instructed_amount , "InstdAmt" , :string, nil, :attributes => { :Ccy => :instructed_amount_currency }
|
12
|
+
attribute :charge_bearer , "ChrgBr"
|
13
|
+
attribute :direct_debit_transation , "DrctDbtTx" , Sepa::PaymentsInitiation::Pain00800104::DirectDebitTransaction
|
14
|
+
attribute :ultimate_creditor , "UltmtCdtr" , Sepa::PaymentsInitiation::PartyIdentification
|
15
|
+
attribute :debtor_agent , "DbtrAgt" , Sepa::PaymentsInitiation::BranchAndFinancialInstitutionIdentification
|
16
|
+
attribute :debtor_agent_account , "DbtrAgtAcct" , Sepa::PaymentsInitiation::CashAccount
|
17
|
+
attribute :debtor , "Dbtr" , Sepa::PaymentsInitiation::PartyIdentification
|
18
|
+
attribute :debtor_account , "DbtrAcct" , Sepa::PaymentsInitiation::CashAccount
|
19
|
+
attribute :ultimate_debtor , "UltmtDbtr" , Sepa::PaymentsInitiation::PartyIdentification
|
20
|
+
attribute :instruction_for_creditor_agent, "InstrForCdtrAgt"
|
21
|
+
attribute :purpose , "Purp" , Sepa::PaymentsInitiation::Pain00800104::PurposeChoice
|
22
|
+
attribute :regulatory_reporting , "RgltryRptg" , :[], Sepa::PaymentsInitiation::Pain00800104::RegulatoryReporting
|
23
|
+
|
24
|
+
attr_accessor :instructed_amount_currency
|
25
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class Sepa::PaymentsInitiation::Pain00800104::GroupHeader < Sepa::Base
|
2
|
+
definition "Set of characteristics shared by all individual transactions included in the message."
|
3
|
+
attribute :message_identification, "MsgId"
|
4
|
+
attribute :creation_date_time , "CreDtTm", Time
|
5
|
+
attribute :number_of_transactions, "NbOfTxs"
|
6
|
+
attribute :initiating_party , "InitgPty", Sepa::PaymentsInitiation::PartyIdentification
|
7
|
+
attribute :control_sum , "CtrlSum"
|
8
|
+
attribute :authorisation , "Authstn", Sepa::PaymentsInitiation::Authorisation
|
9
|
+
attribute :forwarding_agent , "FwdgAgt", Sepa::PaymentsInitiation::BranchAndFinancialInstitutionIdentification
|
10
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "sepa/payments_initiation/pain00800104/direct_debit_transaction_information"
|
2
|
+
|
3
|
+
class Sepa::PaymentsInitiation::Pain00800104::PaymentInformation < Sepa::Base
|
4
|
+
attribute :payment_information_identification , "PmtInfId"
|
5
|
+
attribute :payment_method , "PmtMtd"
|
6
|
+
attribute :batch_booking , "BtchBookg"
|
7
|
+
attribute :number_of_transactions , "NbOfTxs"
|
8
|
+
attribute :control_sum , "CtrlSum"
|
9
|
+
attribute :payment_type_information , "PmtTpInf"
|
10
|
+
attribute :requested_collection_date , "ReqdColltnDt", Date
|
11
|
+
attribute :creditor , "Cdtr" , Sepa::PaymentsInitiation::PartyIdentification
|
12
|
+
attribute :creditor_account , "CdtrAcct" , Sepa::PaymentsInitiation::CashAccount
|
13
|
+
attribute :creditor_agent , "CdtrAgt" , Sepa::PaymentsInitiation::BranchAndFinancialInstitutionIdentification
|
14
|
+
attribute :creditor_agent_account , "CdtrAgtAcct" , Sepa::PaymentsInitiation::CashAccount
|
15
|
+
attribute :ultimate_creditor , "UltmtCdtr" , Sepa::PaymentsInitiation::PartyIdentification
|
16
|
+
attribute :charge_bearer , "ChrgBr"
|
17
|
+
attribute :charges_account , "ChrgsAcct" , Sepa::PaymentsInitiation::CashAccount
|
18
|
+
attribute :charges_account_agent , "ChrgsAcctAgt", Sepa::PaymentsInitiation::BranchAndFinancialInstitutionIdentification
|
19
|
+
attribute :creditor_scheme_identification , "CdtrSchmeId" , Sepa::PaymentsInitiation::PartyIdentification
|
20
|
+
attribute :direct_debit_transaction_information, "DrctDbtTxInf", :[], Sepa::PaymentsInitiation::Pain00800104::DirectDebitTransactionInformation
|
21
|
+
end
|
22
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "sepa/payments_initiation/pain00800104/service_level_choice"
|
2
|
+
require "sepa/payments_initiation/local_instrument_choice"
|
3
|
+
|
4
|
+
class Sepa::PaymentsInitiation::Pain00800104::PaymentTypeInformation < Sepa::Base
|
5
|
+
definition "Set of elements used to further specify the type of transaction."
|
6
|
+
attribute :instruction_priority, "InstrPrty"
|
7
|
+
attribute :service_level , "SvcLvl", Sepa::PaymentsInitiation::Pain00800104::ServiceLevelChoice
|
8
|
+
attribute :local_instrument , "LclInstrm", Sepa::PaymentsInitiation::LocalInstrumentChoice
|
9
|
+
attribute :sequence_type , "SeqTp"
|
10
|
+
attribute :category_purpose , "CtgyPurp", Sepa::PaymentsInitiation::CategoryPurposeChoice
|
11
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require "sepa/payments_initiation/pain00800104/regulatory_authority"
|
2
|
+
require "sepa/payments_initiation/pain00800104/structured_regulatory_reporting"
|
3
|
+
|
4
|
+
class Sepa::PaymentsInitiation::Pain00800104::RegulatoryReporting < Sepa::Base
|
5
|
+
definition "Information needed due to regulatory and/or statutory requirements."
|
6
|
+
attribute :debit_credit_reporting_indicator, "DbtCdtRptgInd"
|
7
|
+
attribute :authority , "Authrty" , Sepa::PaymentsInitiation::Pain00800104::RegulatoryAuthority
|
8
|
+
attribute :details , "Dtls" , Sepa::PaymentsInitiation::Pain00800104::StructuredRegulatoryReporting
|
9
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class Sepa::PaymentsInitiation::Pain00800104::StructuredRegulatoryReporting < Sepa::Base
|
2
|
+
definition "Set of elements used to provide details on the regulatory reporting information."
|
3
|
+
attribute :type , "Tp"
|
4
|
+
attribute :date , "Dt" , Date
|
5
|
+
attribute :country , "Ctry"
|
6
|
+
attribute :code , "Cd"
|
7
|
+
attribute :amount , "Amt"
|
8
|
+
attribute :information, :[]
|
9
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
require "sepa/payments_initiation/pain00800104/tax_party"
|
2
|
+
|
3
|
+
class Sepa::PaymentsInitiation::Pain00800104::TaxInformation < Sepa::Base
|
4
|
+
definition "Details about tax paid, or to be paid, to the government in accordance with the law, including pre-defined parameters such as thresholds and type of account."
|
5
|
+
attribute :creditor, "Cdtr", Sepa::PaymentsInitiation::Pain00800104::TaxParty
|
6
|
+
attribute :debtor, "Dbtr", Sepa::PaymentsInitiation::Pain00800104::TaxParty
|
7
|
+
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
class Sepa::PaymentsInitiation::Pain00800104::TaxParty < Sepa::Base
|
2
|
+
definition "Party to the transaction to which the tax applies."
|
3
|
+
attribute :tax_identification, "TaxId"
|
4
|
+
attribute :registration_identification, "RegnId"
|
5
|
+
attribute :tax_type, "TaxTp"
|
6
|
+
attribute :authorisation, "Authstn", Sepa::PaymentsInitiation::Pain00800104::TaxAuthorisation
|
7
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require "sepa/payments_initiation/postal_address"
|
2
|
+
require "sepa/payments_initiation/party_choice_identification"
|
3
|
+
|
4
|
+
class Sepa::PaymentsInitiation::PartyIdentification < Sepa::Base
|
5
|
+
definition "Set of elements used to identify a person or an organisation."
|
6
|
+
attribute :name , "Nm"
|
7
|
+
attribute :postal_address , "PstlAdr" , Sepa::PaymentsInitiation::PostalAddress
|
8
|
+
attribute :identification , "Id" , Sepa::PaymentsInitiation::PartyChoiceIdentification
|
9
|
+
attribute :country_of_residence, "CtryOfRes"
|
10
|
+
attribute :contact_details , "CtctDtls" , Sepa::PaymentsInitiation::ContactDetails
|
11
|
+
end
|
12
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Sepa::PaymentsInitiation::PostalAddress < Sepa::Base
|
2
|
+
definition "Information that locates and identifies a specific address, as defined by postal services."
|
3
|
+
attribute :address_type , "AdrTyp"
|
4
|
+
attribute :department , "Dept"
|
5
|
+
attribute :sub_department , "SubDept"
|
6
|
+
attribute :street_name , "StrtNm"
|
7
|
+
attribute :building_number , "BldgNb"
|
8
|
+
attribute :post_code , "PstCd"
|
9
|
+
attribute :town_name , "TwnNm"
|
10
|
+
attribute :country_sub_division , "CtySubDvsn"
|
11
|
+
attribute :country , "Ctry"
|
12
|
+
attribute :address_line , "AdrLine" , :[]
|
13
|
+
end
|
data/lib/sepa/version.rb
ADDED
data/sepa.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- coding: utf-8; mode: ruby -*-
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require 'sepa/version'
|
7
|
+
|
8
|
+
Gem::Specification.new do |gem|
|
9
|
+
gem.name = "sepa"
|
10
|
+
gem.version = Sepa::VERSION
|
11
|
+
gem.authors = ["Conan Dalton"]
|
12
|
+
gem.email = ["conan@conandalton.net"]
|
13
|
+
gem.description = %q{ Generate ISO20022 XML messages. Implements pain.008.001.04 CustomerDirectDebitInitiation for now.}
|
14
|
+
gem.summary = %q{ pain.008.001.04 CustomerDirectDebitInitiation ISO20022 XML }
|
15
|
+
gem.homepage = "https://github.com/conanite/sepa"
|
16
|
+
|
17
|
+
gem.add_dependency 'builder'
|
18
|
+
gem.add_dependency 'aduki'
|
19
|
+
gem.add_development_dependency 'rspec', '~> 2.9'
|
20
|
+
|
21
|
+
gem.files = `git ls-files`.split($/)
|
22
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
23
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
24
|
+
gem.require_paths = ["lib"]
|
25
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
require "time"
|
5
|
+
|
6
|
+
describe Sepa::DirectDebitOrder do
|
7
|
+
|
8
|
+
it "should produce xml corresponding to the given inputs" do
|
9
|
+
bank_account0 = Sepa::DirectDebitOrder::BankAccount.new "FRZIZIPAPARAZZI345789", "FRZZPPKOOKOO"
|
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
|
+
dd0 = Sepa::DirectDebitOrder::DirectDebit.new debtor0, bank_account0, "MONECOLE REG F13789 PVT 3", 1231.31, "EUR"
|
12
|
+
|
13
|
+
bank_account1 = Sepa::DirectDebitOrder::BankAccount.new "FRQUIQUIWIGWAM947551", "FRQQWIGGA"
|
14
|
+
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"
|
15
|
+
dd1 = Sepa::DirectDebitOrder::DirectDebit.new debtor1, bank_account1, "MONECOLE REG F13790 PVT 3", 1732.32, "EUR"
|
16
|
+
|
17
|
+
sepa_now = Time.strptime "1992-02-28T18:30:00", "%Y-%m-%dT%H:%M:%S"
|
18
|
+
Time.stub(:now).and_return sepa_now
|
19
|
+
|
20
|
+
creditor = Sepa::DirectDebitOrder::Party.new "Mon École", "3, Livva de Getamire", nil, "75022", "Paris", "FR", "M. le Directeur", "+33 999 999 999", "directeur@monecole.softify.com"
|
21
|
+
creditor_account = Sepa::DirectDebitOrder::BankAccount.new "FRGOOGOOYADDA9999999", "FRGGYELLOW99"
|
22
|
+
payment = Sepa::DirectDebitOrder::CreditorPayment.new creditor, creditor_account, "MONECOLE_PAYMENTS_20130703", Date.parse("2013-07-10"), [dd0, dd1]
|
23
|
+
|
24
|
+
initiator = Sepa::DirectDebitOrder::Party.new "SOFTIFY SARL", "289, Livva de Getamire", nil, "75021", "Paris", "FR", "M. Le Gérant", "+33 111 111 111", "gerant@softify.bigbang"
|
25
|
+
|
26
|
+
order = Sepa::DirectDebitOrder::Order.new "MSG0001", initiator, [payment]
|
27
|
+
|
28
|
+
xml = order.to_xml
|
29
|
+
expected = File.read(File.expand_path("../expected_customer_direct_debit_initiation.xml", __FILE__))
|
30
|
+
xml.should == expected
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
---
|
2
|
+
group_header.message_identification: MSG0001
|
3
|
+
group_header.creation_date_time: '1992-02-28T18:30:00'
|
4
|
+
group_header.number_of_transactions: '3'
|
5
|
+
group_header.initiating_party.name: SOFTIFY SARL
|
6
|
+
group_header.initiating_party.postal_address.address_line[0]: 289, Livva de Getamire
|
7
|
+
group_header.initiating_party.postal_address.post_code: '75021'
|
8
|
+
group_header.initiating_party.postal_address.town_name: Paris
|
9
|
+
group_header.initiating_party.postal_address.country: FR
|
10
|
+
payment_information[0].payment_information_identification: MONECOLE_PAYMENTS_20130703
|
11
|
+
payment_information[0].payment_method: DD
|
12
|
+
payment_information[0].requested_collection_date: '2013-07-10'
|
13
|
+
payment_information[0].creditor.name: Mon École
|
14
|
+
payment_information[0].creditor.postal_address.address_line[0]: 3, Livva de Getamire
|
15
|
+
payment_information[0].creditor.postal_address.post_code: '75022'
|
16
|
+
payment_information[0].creditor.postal_address.town_name: Paris
|
17
|
+
payment_information[0].creditor.postal_address.country: FR
|
18
|
+
payment_information[0].creditor.contact_details.name: M. le Directeur
|
19
|
+
payment_information[0].creditor.contact_details.phone_number: +33 999 999 999
|
20
|
+
payment_information[0].creditor.contact_details.email_address: directeur@monecole.softify.com
|
21
|
+
payment_information[0].creditor_account.identification.iban: FRGOOGOOYADDA9999999
|
22
|
+
payment_information[0].creditor_agent.financial_institution_identification.bic_fi: FRGGYELLOW99
|
23
|
+
payment_information[0].direct_debit_transaction_information[0].payment_identification.end_to_end_identification: MONECOLE REG F13789 PVT 3
|
24
|
+
payment_information[0].direct_debit_transaction_information[0].instructed_amount: '1231.31'
|
25
|
+
payment_information[0].direct_debit_transaction_information[0].instructed_amount_currency: EUR
|
26
|
+
payment_information[0].direct_debit_transaction_information[0].debtor_agent.financial_institution_identification.bic_fi: FRZZPPKOOKOO
|
27
|
+
payment_information[0].direct_debit_transaction_information[0].debtor.name: DALTON/CONANMR
|
28
|
+
payment_information[0].direct_debit_transaction_information[0].debtor.postal_address.address_line[0]: 64, Livva de Getamire
|
29
|
+
payment_information[0].direct_debit_transaction_information[0].debtor.postal_address.post_code: '75024'
|
30
|
+
payment_information[0].direct_debit_transaction_information[0].debtor.postal_address.town_name: PARIS
|
31
|
+
payment_information[0].direct_debit_transaction_information[0].debtor.postal_address.country: FR
|
32
|
+
payment_information[0].direct_debit_transaction_information[0].debtor_account.identification.iban: FRZIZIPAPARAZZI345789
|
33
|
+
payment_information[0].direct_debit_transaction_information[1].payment_identification.end_to_end_identification: MONECOLE REG F13790 PVT 3
|
34
|
+
payment_information[0].direct_debit_transaction_information[1].instructed_amount: '1732.32'
|
35
|
+
payment_information[0].direct_debit_transaction_information[1].instructed_amount_currency: EUR
|
36
|
+
payment_information[0].direct_debit_transaction_information[1].debtor_agent.financial_institution_identification.bic_fi: FRQQWIGGA
|
37
|
+
payment_information[0].direct_debit_transaction_information[1].debtor.name: ADAMS/SAMUELMR
|
38
|
+
payment_information[0].direct_debit_transaction_information[1].debtor.postal_address.address_line[0]: 256, Livva de Getamire
|
39
|
+
payment_information[0].direct_debit_transaction_information[1].debtor.postal_address.post_code: '75048'
|
40
|
+
payment_information[0].direct_debit_transaction_information[1].debtor.postal_address.town_name: PARIS
|
41
|
+
payment_information[0].direct_debit_transaction_information[1].debtor.postal_address.country: FR
|
42
|
+
payment_information[0].direct_debit_transaction_information[1].debtor_account.identification.iban: FRQUIQUIWIGWAM947551
|
@@ -0,0 +1,113 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.008.001.04" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.008.001.04 pain.008.001.04.xsd">
|
3
|
+
<CstmrDrctDbtInitn>
|
4
|
+
<GrpHdr>
|
5
|
+
<MsgId>MSG0001</MsgId>
|
6
|
+
<CreDtTm>1992-02-28T18:30:00</CreDtTm>
|
7
|
+
<NbOfTxs>2</NbOfTxs>
|
8
|
+
<InitgPty>
|
9
|
+
<Nm>SOFTIFY SARL</Nm>
|
10
|
+
<PstlAdr>
|
11
|
+
<PstCd>75021</PstCd>
|
12
|
+
<TwnNm>Paris</TwnNm>
|
13
|
+
<Ctry>FR</Ctry>
|
14
|
+
<AdrLine>289, Livva de Getamire</AdrLine>
|
15
|
+
</PstlAdr>
|
16
|
+
<CtctDtls>
|
17
|
+
<Nm>M. Le Gérant</Nm>
|
18
|
+
<PhneNb>+33 111 111 111</PhneNb>
|
19
|
+
<EmailAdr>gerant@softify.bigbang</EmailAdr>
|
20
|
+
</CtctDtls>
|
21
|
+
</InitgPty>
|
22
|
+
</GrpHdr>
|
23
|
+
<PmtInf>
|
24
|
+
<PmtInfId>MONECOLE_PAYMENTS_20130703</PmtInfId>
|
25
|
+
<PmtMtd>DD</PmtMtd>
|
26
|
+
<ReqdColltnDt>2013-07-10</ReqdColltnDt>
|
27
|
+
<Cdtr>
|
28
|
+
<Nm>Mon École</Nm>
|
29
|
+
<PstlAdr>
|
30
|
+
<PstCd>75022</PstCd>
|
31
|
+
<TwnNm>Paris</TwnNm>
|
32
|
+
<Ctry>FR</Ctry>
|
33
|
+
<AdrLine>3, Livva de Getamire</AdrLine>
|
34
|
+
</PstlAdr>
|
35
|
+
<CtctDtls>
|
36
|
+
<Nm>M. le Directeur</Nm>
|
37
|
+
<PhneNb>+33 999 999 999</PhneNb>
|
38
|
+
<EmailAdr>directeur@monecole.softify.com</EmailAdr>
|
39
|
+
</CtctDtls>
|
40
|
+
</Cdtr>
|
41
|
+
<CdtrAcct>
|
42
|
+
<Id>
|
43
|
+
<IBAN>FRGOOGOOYADDA9999999</IBAN>
|
44
|
+
</Id>
|
45
|
+
</CdtrAcct>
|
46
|
+
<CdtrAgt>
|
47
|
+
<FinInstnId>
|
48
|
+
<BICFI>FRGGYELLOW99</BICFI>
|
49
|
+
</FinInstnId>
|
50
|
+
</CdtrAgt>
|
51
|
+
<DrctDbtTxInf>
|
52
|
+
<PmtId>
|
53
|
+
<EndToEndId>MONECOLE REG F13789 PVT 3</EndToEndId>
|
54
|
+
</PmtId>
|
55
|
+
<InstdAmt Ccy="EUR">1231.31</InstdAmt>
|
56
|
+
<DbtrAgt>
|
57
|
+
<FinInstnId>
|
58
|
+
<BICFI>FRZZPPKOOKOO</BICFI>
|
59
|
+
</FinInstnId>
|
60
|
+
</DbtrAgt>
|
61
|
+
<Dbtr>
|
62
|
+
<Nm>DALTON/CONANMR</Nm>
|
63
|
+
<PstlAdr>
|
64
|
+
<PstCd>30005</PstCd>
|
65
|
+
<TwnNm>RENNES</TwnNm>
|
66
|
+
<Ctry>FR</Ctry>
|
67
|
+
<AdrLine>64, Livva de Getamire</AdrLine>
|
68
|
+
</PstlAdr>
|
69
|
+
<CtctDtls>
|
70
|
+
<Nm>Conan DALTON</Nm>
|
71
|
+
<PhneNb>01234567890</PhneNb>
|
72
|
+
<EmailAdr>conan@dalton.sepa.i.hope.this.works</EmailAdr>
|
73
|
+
</CtctDtls>
|
74
|
+
</Dbtr>
|
75
|
+
<DbtrAcct>
|
76
|
+
<Id>
|
77
|
+
<IBAN>FRZIZIPAPARAZZI345789</IBAN>
|
78
|
+
</Id>
|
79
|
+
</DbtrAcct>
|
80
|
+
</DrctDbtTxInf>
|
81
|
+
<DrctDbtTxInf>
|
82
|
+
<PmtId>
|
83
|
+
<EndToEndId>MONECOLE REG F13790 PVT 3</EndToEndId>
|
84
|
+
</PmtId>
|
85
|
+
<InstdAmt Ccy="EUR">1732.32</InstdAmt>
|
86
|
+
<DbtrAgt>
|
87
|
+
<FinInstnId>
|
88
|
+
<BICFI>FRQQWIGGA</BICFI>
|
89
|
+
</FinInstnId>
|
90
|
+
</DbtrAgt>
|
91
|
+
<Dbtr>
|
92
|
+
<Nm>ADAMS/SAMUELMR</Nm>
|
93
|
+
<PstlAdr>
|
94
|
+
<PstCd>75048</PstCd>
|
95
|
+
<TwnNm>PARIS</TwnNm>
|
96
|
+
<Ctry>FR</Ctry>
|
97
|
+
<AdrLine>256, Livva de Getamire</AdrLine>
|
98
|
+
</PstlAdr>
|
99
|
+
<CtctDtls>
|
100
|
+
<Nm>Samuel ADAMS</Nm>
|
101
|
+
<PhneNb>09876543210</PhneNb>
|
102
|
+
<EmailAdr>samuel@adams.sepa.i.hope.this.works</EmailAdr>
|
103
|
+
</CtctDtls>
|
104
|
+
</Dbtr>
|
105
|
+
<DbtrAcct>
|
106
|
+
<Id>
|
107
|
+
<IBAN>FRQUIQUIWIGWAM947551</IBAN>
|
108
|
+
</Id>
|
109
|
+
</DbtrAcct>
|
110
|
+
</DrctDbtTxInf>
|
111
|
+
</PmtInf>
|
112
|
+
</CstmrDrctDbtInitn>
|
113
|
+
</Document>
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe Sepa::PaymentsInitiation::Pain00800104::CustomerDirectDebitInitiation do
|
6
|
+
|
7
|
+
it "should produce xml corresponding to the given inputs" do
|
8
|
+
props = {
|
9
|
+
"group_header.message_identification" => "MSG0001",
|
10
|
+
"group_header.creation_date_time" => "1992-02-28T18:30:00",
|
11
|
+
"group_header.number_of_transactions" => "2",
|
12
|
+
"group_header.initiating_party.name" => "SOFTIFY SARL",
|
13
|
+
"group_header.initiating_party.postal_address.address_line[0]" => "289, Livva de Getamire",
|
14
|
+
"group_header.initiating_party.postal_address.post_code" => "75021",
|
15
|
+
"group_header.initiating_party.postal_address.town_name" => "Paris",
|
16
|
+
"group_header.initiating_party.postal_address.country" => "FR",
|
17
|
+
"group_header.initiating_party.contact_details.name" => "M. Le Gérant",
|
18
|
+
"group_header.initiating_party.contact_details.phone_number" => "+33 111 111 111",
|
19
|
+
"group_header.initiating_party.contact_details.email_address" => "gerant@softify.bigbang",
|
20
|
+
"payment_information[0].payment_information_identification" => "MONECOLE_PAYMENTS_20130703",
|
21
|
+
"payment_information[0].payment_method" => "DD",
|
22
|
+
"payment_information[0].requested_collection_date" => "2013-07-10",
|
23
|
+
"payment_information[0].creditor.name" => "Mon École",
|
24
|
+
"payment_information[0].creditor.postal_address.address_line[0]" => "3, Livva de Getamire",
|
25
|
+
"payment_information[0].creditor.postal_address.post_code" => "75022",
|
26
|
+
"payment_information[0].creditor.postal_address.town_name" => "Paris",
|
27
|
+
"payment_information[0].creditor.postal_address.country" => "FR",
|
28
|
+
"payment_information[0].creditor.contact_details.name" => "M. le Directeur",
|
29
|
+
"payment_information[0].creditor.contact_details.phone_number" => "+33 999 999 999",
|
30
|
+
"payment_information[0].creditor.contact_details.email_address" => "directeur@monecole.softify.com",
|
31
|
+
"payment_information[0].creditor_account.identification.iban" => "FRGOOGOOYADDA9999999",
|
32
|
+
"payment_information[0].creditor_agent.financial_institution_identification.bic_fi" => "FRGGYELLOW99",
|
33
|
+
"payment_information[0].direct_debit_transaction_information[0].payment_identification.end_to_end_identification" => "MONECOLE REG F13789 PVT 3",
|
34
|
+
"payment_information[0].direct_debit_transaction_information[0].instructed_amount" => "1231.31",
|
35
|
+
"payment_information[0].direct_debit_transaction_information[0].instructed_amount_currency" => "EUR",
|
36
|
+
"payment_information[0].direct_debit_transaction_information[0].debtor_agent.financial_institution_identification.bic_fi" => "FRZZPPKOOKOO",
|
37
|
+
"payment_information[0].direct_debit_transaction_information[0].debtor.name" => "DALTON/CONANMR",
|
38
|
+
"payment_information[0].direct_debit_transaction_information[0].debtor.postal_address.address_line[0]" => "64, Livva de Getamire",
|
39
|
+
"payment_information[0].direct_debit_transaction_information[0].debtor.postal_address.post_code" => "30005",
|
40
|
+
"payment_information[0].direct_debit_transaction_information[0].debtor.postal_address.town_name" => "RENNES",
|
41
|
+
"payment_information[0].direct_debit_transaction_information[0].debtor.postal_address.country" => "FR",
|
42
|
+
"payment_information[0].direct_debit_transaction_information[0].debtor.contact_details.name" => "Conan DALTON",
|
43
|
+
"payment_information[0].direct_debit_transaction_information[0].debtor.contact_details.phone_number" => "01234567890",
|
44
|
+
"payment_information[0].direct_debit_transaction_information[0].debtor.contact_details.email_address" => "conan@dalton.sepa.i.hope.this.works",
|
45
|
+
"payment_information[0].direct_debit_transaction_information[0].debtor_account.identification.iban" => "FRZIZIPAPARAZZI345789",
|
46
|
+
"payment_information[0].direct_debit_transaction_information[1].payment_identification.end_to_end_identification" => "MONECOLE REG F13790 PVT 3",
|
47
|
+
"payment_information[0].direct_debit_transaction_information[1].instructed_amount" => "1732.32",
|
48
|
+
"payment_information[0].direct_debit_transaction_information[1].instructed_amount_currency" => "EUR",
|
49
|
+
"payment_information[0].direct_debit_transaction_information[1].debtor_agent.financial_institution_identification.bic_fi" => "FRQQWIGGA",
|
50
|
+
"payment_information[0].direct_debit_transaction_information[1].debtor.name" => "ADAMS/SAMUELMR",
|
51
|
+
"payment_information[0].direct_debit_transaction_information[1].debtor.postal_address.address_line[0]" => "256, Livva de Getamire",
|
52
|
+
"payment_information[0].direct_debit_transaction_information[1].debtor.postal_address.post_code" => "75048",
|
53
|
+
"payment_information[0].direct_debit_transaction_information[1].debtor.postal_address.town_name" => "PARIS",
|
54
|
+
"payment_information[0].direct_debit_transaction_information[1].debtor.postal_address.country" => "FR",
|
55
|
+
"payment_information[0].direct_debit_transaction_information[1].debtor_account.identification.iban" => "FRQUIQUIWIGWAM947551",
|
56
|
+
"payment_information[0].direct_debit_transaction_information[1].debtor.contact_details.name" => "Samuel ADAMS",
|
57
|
+
"payment_information[0].direct_debit_transaction_information[1].debtor.contact_details.phone_number" => "09876543210",
|
58
|
+
"payment_information[0].direct_debit_transaction_information[1].debtor.contact_details.email_address" => "samuel@adams.sepa.i.hope.this.works"
|
59
|
+
}
|
60
|
+
|
61
|
+
xml = Sepa::PaymentsInitiation::Pain00800104::CustomerDirectDebitInitiation.new(props).generate_xml
|
62
|
+
expected = File.read(File.expand_path("../../../expected_customer_direct_debit_initiation.xml", __FILE__))
|
63
|
+
xml.should == expected
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sepa
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Conan Dalton
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-07-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: builder
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: aduki
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '2.9'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.9'
|
62
|
+
description: ! ' Generate ISO20022 XML messages. Implements pain.008.001.04 CustomerDirectDebitInitiation
|
63
|
+
for now.'
|
64
|
+
email:
|
65
|
+
- conan@conandalton.net
|
66
|
+
executables: []
|
67
|
+
extensions: []
|
68
|
+
extra_rdoc_files: []
|
69
|
+
files:
|
70
|
+
- .gitignore
|
71
|
+
- .rspec
|
72
|
+
- Gemfile
|
73
|
+
- LICENSE.txt
|
74
|
+
- README.md
|
75
|
+
- Rakefile
|
76
|
+
- lib/sepa.rb
|
77
|
+
- lib/sepa/base.rb
|
78
|
+
- lib/sepa/direct_debit_order.rb
|
79
|
+
- lib/sepa/payments_initiation.rb
|
80
|
+
- lib/sepa/payments_initiation/account_identification_choice.rb
|
81
|
+
- lib/sepa/payments_initiation/account_scheme_name_choice.rb
|
82
|
+
- lib/sepa/payments_initiation/authorisation.rb
|
83
|
+
- lib/sepa/payments_initiation/branch_and_financial_institution_identification.rb
|
84
|
+
- lib/sepa/payments_initiation/cash_account.rb
|
85
|
+
- lib/sepa/payments_initiation/cash_account_type_choice.rb
|
86
|
+
- lib/sepa/payments_initiation/category_purpose_choice.rb
|
87
|
+
- lib/sepa/payments_initiation/contact_details.rb
|
88
|
+
- lib/sepa/payments_initiation/financial_institution_identification.rb
|
89
|
+
- lib/sepa/payments_initiation/generic_account_identification.rb
|
90
|
+
- lib/sepa/payments_initiation/local_instrument_choice.rb
|
91
|
+
- lib/sepa/payments_initiation/pain00800104/customer_direct_debit_initiation.rb
|
92
|
+
- lib/sepa/payments_initiation/pain00800104/direct_debit_transaction.rb
|
93
|
+
- lib/sepa/payments_initiation/pain00800104/direct_debit_transaction_information.rb
|
94
|
+
- lib/sepa/payments_initiation/pain00800104/group_header.rb
|
95
|
+
- lib/sepa/payments_initiation/pain00800104/payment_identification.rb
|
96
|
+
- lib/sepa/payments_initiation/pain00800104/payment_information.rb
|
97
|
+
- lib/sepa/payments_initiation/pain00800104/payment_type_information.rb
|
98
|
+
- lib/sepa/payments_initiation/pain00800104/purpose_choice.rb
|
99
|
+
- lib/sepa/payments_initiation/pain00800104/regulatory_authority.rb
|
100
|
+
- lib/sepa/payments_initiation/pain00800104/regulatory_reporting.rb
|
101
|
+
- lib/sepa/payments_initiation/pain00800104/service_level_choice.rb
|
102
|
+
- lib/sepa/payments_initiation/pain00800104/structured_regulatory_reporting.rb
|
103
|
+
- lib/sepa/payments_initiation/pain00800104/tax_authorisation.rb
|
104
|
+
- lib/sepa/payments_initiation/pain00800104/tax_information.rb
|
105
|
+
- lib/sepa/payments_initiation/pain00800104/tax_party.rb
|
106
|
+
- lib/sepa/payments_initiation/party_choice_identification.rb
|
107
|
+
- lib/sepa/payments_initiation/party_identification.rb
|
108
|
+
- lib/sepa/payments_initiation/postal_address.rb
|
109
|
+
- lib/sepa/version.rb
|
110
|
+
- sepa.gemspec
|
111
|
+
- spec/sepa/direct_debit_order_spec.rb
|
112
|
+
- spec/sepa/direct_debit_properties.yml
|
113
|
+
- spec/sepa/expected_customer_direct_debit_initiation.xml
|
114
|
+
- spec/sepa/payments_initiation/pain00800104/customer_direct_debit_initiation_spec.rb
|
115
|
+
- spec/spec_helper.rb
|
116
|
+
homepage: https://github.com/conanite/sepa
|
117
|
+
licenses: []
|
118
|
+
post_install_message:
|
119
|
+
rdoc_options: []
|
120
|
+
require_paths:
|
121
|
+
- lib
|
122
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ! '>='
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
128
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
requirements: []
|
135
|
+
rubyforge_project:
|
136
|
+
rubygems_version: 1.8.24
|
137
|
+
signing_key:
|
138
|
+
specification_version: 3
|
139
|
+
summary: pain.008.001.04 CustomerDirectDebitInitiation ISO20022 XML
|
140
|
+
test_files:
|
141
|
+
- spec/sepa/direct_debit_order_spec.rb
|
142
|
+
- spec/sepa/direct_debit_properties.yml
|
143
|
+
- spec/sepa/expected_customer_direct_debit_initiation.xml
|
144
|
+
- spec/sepa/payments_initiation/pain00800104/customer_direct_debit_initiation_spec.rb
|
145
|
+
- spec/spec_helper.rb
|