sps_king 0.1.0
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 +32 -0
- data/CONTRIBUTING.md +38 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +24 -0
- data/README.md +246 -0
- data/Rakefile +6 -0
- data/gemfiles/Gemfile-activemodel-3.1.x +5 -0
- data/gemfiles/Gemfile-activemodel-3.2.x +5 -0
- data/gemfiles/Gemfile-activemodel-4.0.x +5 -0
- data/gemfiles/Gemfile-activemodel-4.1.x +5 -0
- data/gemfiles/Gemfile-activemodel-4.2.x +5 -0
- data/gemfiles/Gemfile-activemodel-5.0.x +5 -0
- data/gemfiles/Gemfile-activemodel-5.1.x +5 -0
- data/gemfiles/Gemfile-activemodel-5.2.x +5 -0
- data/lib/schema/pain.001.001.03.ch.02.xsd +1212 -0
- data/lib/schema/pain.008.001.02.ch.03.xsd +784 -0
- data/lib/sps_king.rb +22 -0
- data/lib/sps_king/account.rb +24 -0
- data/lib/sps_king/account/creditor_account.rb +11 -0
- data/lib/sps_king/account/creditor_address.rb +37 -0
- data/lib/sps_king/account/debtor_account.rb +5 -0
- data/lib/sps_king/account/debtor_address.rb +34 -0
- data/lib/sps_king/converter.rb +53 -0
- data/lib/sps_king/error.rb +4 -0
- data/lib/sps_king/message.rb +163 -0
- data/lib/sps_king/message/credit_transfer.rb +140 -0
- data/lib/sps_king/message/direct_debit.rb +177 -0
- data/lib/sps_king/structured_remittance_information.rb +20 -0
- data/lib/sps_king/transaction.rb +59 -0
- data/lib/sps_king/transaction/credit_transfer_transaction.rb +19 -0
- data/lib/sps_king/transaction/direct_debit_transaction.rb +58 -0
- data/lib/sps_king/validator.rb +55 -0
- data/lib/sps_king/version.rb +3 -0
- data/spec/examples/pain.001.001.03.ch.02.xml +172 -0
- data/spec/examples/pain.008.001.02.ch.03.xml +240 -0
- data/spec/lib/sps_king/account/creditor_account_spec.rb +52 -0
- data/spec/lib/sps_king/account/creditor_address_spec.rb +14 -0
- data/spec/lib/sps_king/account/debtor_account_spec.rb +14 -0
- data/spec/lib/sps_king/account/debtor_address_spec.rb +14 -0
- data/spec/lib/sps_king/account_spec.rb +42 -0
- data/spec/lib/sps_king/converter_spec.rb +88 -0
- data/spec/lib/sps_king/message/credit_transfer_spec.rb +350 -0
- data/spec/lib/sps_king/message/direct_debit_spec.rb +483 -0
- data/spec/lib/sps_king/message_spec.rb +128 -0
- data/spec/lib/sps_king/structured_remittance_information_spec.rb +32 -0
- data/spec/lib/sps_king/transaction/credit_transfer_transaction_spec.rb +53 -0
- data/spec/lib/sps_king/transaction/direct_debit_transaction_spec.rb +56 -0
- data/spec/lib/sps_king/transaction_spec.rb +133 -0
- data/spec/lib/sps_king/validation_spec.rb +23 -0
- data/spec/lib/sps_king/validator_spec.rb +78 -0
- data/spec/spec_helper.rb +33 -0
- data/spec/support/active_model.rb +30 -0
- data/spec/support/custom_matcher.rb +60 -0
- data/spec/support/factories.rb +33 -0
- data/spec/support/validations.rb +27 -0
- data/sps_king.gemspec +31 -0
- metadata +237 -0
@@ -0,0 +1,177 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module SPS
|
4
|
+
class DirectDebit < Message
|
5
|
+
self.account_class = CreditorAccount
|
6
|
+
self.transaction_class = DirectDebitTransaction
|
7
|
+
self.xml_main_tag = 'CstmrDrctDbtInitn'
|
8
|
+
self.known_schemas = [
|
9
|
+
PAIN_008_001_02_CH_03
|
10
|
+
]
|
11
|
+
|
12
|
+
validate do |record|
|
13
|
+
if record.transactions.map(&:local_instrument).uniq.size > 1
|
14
|
+
errors.add(
|
15
|
+
:base,
|
16
|
+
'different local_instruments (e.g. LSV+, BDD) must not be mixed in one message!'
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
# Find groups of transactions which share the same values of some attributes
|
23
|
+
def transaction_group(transaction)
|
24
|
+
{
|
25
|
+
requested_date: transaction.requested_date,
|
26
|
+
service_level: transaction.service_level,
|
27
|
+
local_instrument: transaction.local_instrument,
|
28
|
+
account: transaction.creditor_account || account
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def creditor_scheme_name(service_level)
|
33
|
+
case service_level
|
34
|
+
when 'CHDD' # PAIN_008_001_02_CH_03 only
|
35
|
+
return 'CHDD'
|
36
|
+
when 'CHTA' # PAIN_008_001_02_CH_03 only
|
37
|
+
return 'CHLS'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# For IBANs from Switzerland or Liechtenstein the clearing system member id can be retrieved
|
42
|
+
# as the 5th to 9th digit of the IBAN, which is the local bank code.
|
43
|
+
def clearing_system_member_id_from_iban(iban)
|
44
|
+
return iban.to_s[4..8].sub(/^0*/, '')
|
45
|
+
end
|
46
|
+
|
47
|
+
def build_payment_informations(builder)
|
48
|
+
# Build a PmtInf block for every group of transactions
|
49
|
+
grouped_transactions.each do |group, transactions|
|
50
|
+
builder.PmtInf do
|
51
|
+
builder.PmtInfId(payment_information_identification(group))
|
52
|
+
builder.PmtMtd('DD')
|
53
|
+
builder.PmtTpInf do
|
54
|
+
builder.SvcLvl do
|
55
|
+
builder.Prtry(group[:service_level])
|
56
|
+
end
|
57
|
+
builder.LclInstrm do
|
58
|
+
builder.Prtry(group[:local_instrument])
|
59
|
+
end
|
60
|
+
end
|
61
|
+
builder.ReqdColltnDt(group[:requested_date].iso8601)
|
62
|
+
builder.Cdtr do
|
63
|
+
builder.Nm(group[:account].name)
|
64
|
+
end
|
65
|
+
builder.CdtrAcct do
|
66
|
+
builder.Id do
|
67
|
+
builder.IBAN(group[:account].iban)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
builder.CdtrAgt do
|
71
|
+
builder.FinInstnId do
|
72
|
+
builder.ClrSysMmbId do
|
73
|
+
builder.MmbId(clearing_system_member_id_from_iban(group[:account].iban))
|
74
|
+
end
|
75
|
+
if group[:account].isr_participant_number
|
76
|
+
builder.Othr do
|
77
|
+
builder.Id(group[:account].isr_participant_number)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
builder.CdtrSchmeId do
|
83
|
+
builder.Id do
|
84
|
+
builder.PrvtId do
|
85
|
+
builder.Othr do
|
86
|
+
builder.Id(group[:account].creditor_identifier)
|
87
|
+
builder.SchmeNm do
|
88
|
+
builder.Prtry(creditor_scheme_name(group[:service_level]))
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
transactions.each do |transaction|
|
96
|
+
build_transaction(builder, transaction)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def build_transaction(builder, transaction)
|
103
|
+
builder.DrctDbtTxInf do
|
104
|
+
builder.PmtId do
|
105
|
+
builder.InstrId(transaction.instruction)
|
106
|
+
builder.EndToEndId(transaction.reference)
|
107
|
+
end
|
108
|
+
builder.InstdAmt('%.2f' % transaction.amount, Ccy: transaction.currency)
|
109
|
+
builder.DbtrAgt do
|
110
|
+
builder.FinInstnId do
|
111
|
+
builder.ClrSysMmbId do
|
112
|
+
builder.MmbId(clearing_system_member_id_from_iban(transaction.iban))
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
builder.Dbtr do
|
117
|
+
builder.Nm(transaction.name)
|
118
|
+
if transaction.debtor_address
|
119
|
+
builder.PstlAdr do
|
120
|
+
# Only set the fields that are actually provided.
|
121
|
+
# StrtNm, BldgNb, PstCd, TwnNm provide a structured address
|
122
|
+
# separated into its individual fields.
|
123
|
+
# AdrLine provides the address in free format text.
|
124
|
+
# Both are currently allowed and the actual preference depends on the bank.
|
125
|
+
# Also the fields that are required legally may vary depending on the country
|
126
|
+
# or change over time.
|
127
|
+
if transaction.debtor_address.street_name
|
128
|
+
builder.StrtNm transaction.debtor_address.street_name
|
129
|
+
end
|
130
|
+
|
131
|
+
if transaction.debtor_address.post_code
|
132
|
+
builder.PstCd transaction.debtor_address.post_code
|
133
|
+
end
|
134
|
+
|
135
|
+
if transaction.debtor_address.town_name
|
136
|
+
builder.TwnNm transaction.debtor_address.town_name
|
137
|
+
end
|
138
|
+
|
139
|
+
if transaction.debtor_address.country_code
|
140
|
+
builder.Ctry transaction.debtor_address.country_code
|
141
|
+
end
|
142
|
+
|
143
|
+
if transaction.debtor_address.address_line1
|
144
|
+
builder.AdrLine transaction.debtor_address.address_line1
|
145
|
+
end
|
146
|
+
|
147
|
+
if transaction.debtor_address.address_line2
|
148
|
+
builder.AdrLine transaction.debtor_address.address_line2
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
builder.DbtrAcct do
|
154
|
+
builder.Id do
|
155
|
+
builder.IBAN(transaction.iban)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
builder.RmtInf do
|
159
|
+
if transaction.remittance_information
|
160
|
+
builder.Ustrd(transaction.remittance_information)
|
161
|
+
end
|
162
|
+
|
163
|
+
builder.Strd do
|
164
|
+
builder.CdtrRefInf do
|
165
|
+
builder.Tp do
|
166
|
+
builder.CdOrPrtry do
|
167
|
+
builder.Prtry(transaction.structured_remittance_information.proprietary)
|
168
|
+
end
|
169
|
+
end
|
170
|
+
builder.Ref(transaction.structured_remittance_information.reference)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module SPS
|
2
|
+
class StructuredRemittanceInformation
|
3
|
+
include ActiveModel::Validations
|
4
|
+
extend Converter
|
5
|
+
|
6
|
+
attr_accessor :proprietary,
|
7
|
+
:reference
|
8
|
+
|
9
|
+
validates_inclusion_of :proprietary, in: %w(ESR IPI)
|
10
|
+
validates_length_of :reference, within: 1..35
|
11
|
+
|
12
|
+
convert :proprietary, :reference, to: :text
|
13
|
+
|
14
|
+
def initialize(attributes = {})
|
15
|
+
attributes.each do |name, value|
|
16
|
+
public_send("#{name}=", value)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module SPS
|
3
|
+
class Transaction
|
4
|
+
include ActiveModel::Validations
|
5
|
+
extend Converter
|
6
|
+
|
7
|
+
DEFAULT_REQUESTED_DATE = Date.new(1999, 1, 1).freeze
|
8
|
+
|
9
|
+
attr_accessor :name,
|
10
|
+
:iban,
|
11
|
+
:bic,
|
12
|
+
:amount,
|
13
|
+
:instruction,
|
14
|
+
:reference,
|
15
|
+
:remittance_information,
|
16
|
+
:structured_remittance_information,
|
17
|
+
:requested_date,
|
18
|
+
:batch_booking,
|
19
|
+
:currency,
|
20
|
+
:debtor_address,
|
21
|
+
:creditor_address
|
22
|
+
|
23
|
+
convert :name, :instruction, :reference, :remittance_information, to: :text
|
24
|
+
convert :amount, to: :decimal
|
25
|
+
|
26
|
+
validates_length_of :name, within: 1..70
|
27
|
+
validates_length_of :currency, is: 3
|
28
|
+
validates_length_of :instruction, within: 1..35, allow_nil: true
|
29
|
+
validates_length_of :reference, within: 1..35, allow_nil: true
|
30
|
+
validates_length_of :remittance_information, within: 1..140, allow_nil: true
|
31
|
+
validates_numericality_of :amount, greater_than: 0
|
32
|
+
validates_presence_of :requested_date
|
33
|
+
validates_inclusion_of :batch_booking, :in => [true, false]
|
34
|
+
validates_with BICValidator,
|
35
|
+
IBANValidator,
|
36
|
+
message: "%{value} is invalid"
|
37
|
+
|
38
|
+
def initialize(attributes = {})
|
39
|
+
attributes.each do |name, value|
|
40
|
+
send("#{name}=", value)
|
41
|
+
end
|
42
|
+
|
43
|
+
self.requested_date ||= DEFAULT_REQUESTED_DATE
|
44
|
+
self.reference ||= 'NOTPROVIDED'
|
45
|
+
self.batch_booking = true if self.batch_booking.nil?
|
46
|
+
self.currency ||= 'EUR'
|
47
|
+
end
|
48
|
+
|
49
|
+
protected
|
50
|
+
|
51
|
+
def validate_requested_date_after(min_requested_date)
|
52
|
+
return unless requested_date.is_a?(Date)
|
53
|
+
|
54
|
+
if requested_date != DEFAULT_REQUESTED_DATE && requested_date < min_requested_date
|
55
|
+
errors.add(:requested_date, "must be greater or equal to #{min_requested_date}, or nil")
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module SPS
|
3
|
+
class CreditTransferTransaction < Transaction
|
4
|
+
attr_accessor :service_level,
|
5
|
+
:creditor_address,
|
6
|
+
:category_purpose
|
7
|
+
|
8
|
+
validates_length_of :category_purpose, within: 1..4, allow_nil: true
|
9
|
+
|
10
|
+
validate { |t| t.validate_requested_date_after(Date.today) }
|
11
|
+
|
12
|
+
def schema_compatible?(schema_name)
|
13
|
+
case schema_name
|
14
|
+
when PAIN_001_001_03_CH_02
|
15
|
+
!self.bic.nil?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module SPS
|
3
|
+
class DirectDebitTransaction < Transaction
|
4
|
+
SERVICE_LEVELS = %w(CHDD CHTA)
|
5
|
+
|
6
|
+
LOCAL_INSTRUMENTS_FOR_SERVICE_LEVELS = {
|
7
|
+
'CHDD' => %w(DDCOR1 DDB2B),
|
8
|
+
'CHTA' => %w(LSV+ BDD)
|
9
|
+
}
|
10
|
+
|
11
|
+
attr_accessor :service_level,
|
12
|
+
:local_instrument,
|
13
|
+
:creditor_account,
|
14
|
+
:debtor_address
|
15
|
+
|
16
|
+
validates_format_of :iban, with: /\A(CH|LI)/
|
17
|
+
|
18
|
+
validates_presence_of :instruction,
|
19
|
+
:structured_remittance_information
|
20
|
+
|
21
|
+
validates_inclusion_of :service_level, in: SERVICE_LEVELS, allow_nil: true
|
22
|
+
validate { |t| t.validate_local_instrument }
|
23
|
+
validate { |t| t.validate_requested_date_after(Date.today.next) }
|
24
|
+
|
25
|
+
validate do |t|
|
26
|
+
if creditor_account
|
27
|
+
errors.add(:creditor_account, 'is not correct') unless creditor_account.valid?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize(attributes = {})
|
32
|
+
super
|
33
|
+
self.service_level ||= 'CHTA'
|
34
|
+
self.local_instrument ||= 'LSV+'
|
35
|
+
end
|
36
|
+
|
37
|
+
def schema_compatible?(schema_name)
|
38
|
+
case schema_name
|
39
|
+
when PAIN_008_001_02_CH_03
|
40
|
+
self.structured_remittance_information.present? &&
|
41
|
+
self.structured_remittance_information.valid?
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def validate_local_instrument
|
46
|
+
if SERVICE_LEVELS.include?(self.service_level)
|
47
|
+
allowed_local_instruments = LOCAL_INSTRUMENTS_FOR_SERVICE_LEVELS[self.service_level]
|
48
|
+
|
49
|
+
if !allowed_local_instruments.include?(self.local_instrument)
|
50
|
+
errors.add(
|
51
|
+
:local_instrument,
|
52
|
+
"is not correct. Must be one of #{allowed_local_instruments.join(', ')}"
|
53
|
+
)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module SPS
|
3
|
+
class IBANValidator < ActiveModel::Validator
|
4
|
+
# IBAN2007Identifier (taken from schema)
|
5
|
+
REGEX = /\A[A-Z]{2,2}[0-9]{2,2}[a-zA-Z0-9]{1,30}\z/
|
6
|
+
|
7
|
+
def validate(record)
|
8
|
+
field_name = options[:field_name] || :iban
|
9
|
+
value = record.send(field_name).to_s
|
10
|
+
|
11
|
+
unless IBANTools::IBAN.valid?(value) && value.match(REGEX)
|
12
|
+
record.errors.add(field_name, :invalid, message: options[:message])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class BICValidator < ActiveModel::Validator
|
18
|
+
# AnyBICIdentifier (taken from schema)
|
19
|
+
REGEX = /\A[A-Z]{6,6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3,3}){0,1}\z/
|
20
|
+
|
21
|
+
def validate(record)
|
22
|
+
field_name = options[:field_name] || :bic
|
23
|
+
value = record.send(field_name)
|
24
|
+
|
25
|
+
if value
|
26
|
+
unless value.to_s.match(REGEX)
|
27
|
+
record.errors.add(field_name, :invalid, message: options[:message])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class CreditorIdentifierValidator < ActiveModel::Validator
|
34
|
+
REGEX = /\A[a-zA-Z]{2,2}[0-9]{2,2}([A-Za-z0-9]|[\+|\?|\/|\-|\:|\(|\)|\.|,|']){3,3}([A-Za-z0-9]|[\+|\?|\/|\-|:|\(|\)|\.|,|']){1,28}\z|\A[A-Z0-9]{5,5}\z/
|
35
|
+
|
36
|
+
def validate(record)
|
37
|
+
field_name = options[:field_name] || :creditor_identifier
|
38
|
+
value = record.send(field_name)
|
39
|
+
|
40
|
+
unless valid?(value)
|
41
|
+
record.errors.add(field_name, :invalid, message: options[:message])
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def valid?(creditor_identifier)
|
46
|
+
if ok = creditor_identifier.to_s.match(REGEX)
|
47
|
+
# In Germany, the identifier has to be exactly 18 chars long
|
48
|
+
if creditor_identifier[0..1].match(/DE/i)
|
49
|
+
ok = creditor_identifier.length == 18
|
50
|
+
end
|
51
|
+
end
|
52
|
+
ok
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!--
|
3
|
+
(C) Copyright 2010, SKSF, www.sksf.ch
|
4
|
+
|
5
|
+
Anregungen und Fragen zu diesem Dokument können an das jeweilige Finanzinstitut gerichtet werden.
|
6
|
+
Allgemeine Anregungen können auch bei der SIX Interbank Clearing AG unter folgender Adresse angebracht werden:
|
7
|
+
pm@six-group.com
|
8
|
+
-->
|
9
|
+
<Document xmlns="http://www.six-interbank-clearing.com/de/pain.001.001.03.ch.02.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.six-interbank-clearing.com/de/pain.001.001.03.ch.02.xsd pain.001.001.03.ch.02.xsd">
|
10
|
+
<CstmrCdtTrfInitn>
|
11
|
+
<GrpHdr>
|
12
|
+
<MsgId>MSG-01</MsgId>
|
13
|
+
<CreDtTm>2010-02-15T07:30:00</CreDtTm>
|
14
|
+
<NbOfTxs>3</NbOfTxs>
|
15
|
+
<CtrlSum>15850.00</CtrlSum>
|
16
|
+
<InitgPty>
|
17
|
+
<Nm>MUSTER AG</Nm>
|
18
|
+
</InitgPty>
|
19
|
+
</GrpHdr>
|
20
|
+
<PmtInf>
|
21
|
+
<PmtInfId>PMTINF-01</PmtInfId>
|
22
|
+
<PmtMtd>TRF</PmtMtd>
|
23
|
+
<BtchBookg>true</BtchBookg>
|
24
|
+
<ReqdExctnDt>2010-02-22</ReqdExctnDt>
|
25
|
+
<Dbtr>
|
26
|
+
<Nm>MUSTER AG</Nm>
|
27
|
+
<PstlAdr>
|
28
|
+
<Ctry>CH</Ctry>
|
29
|
+
<AdrLine>SELDWYLA</AdrLine>
|
30
|
+
</PstlAdr>
|
31
|
+
</Dbtr>
|
32
|
+
<DbtrAcct>
|
33
|
+
<Id>
|
34
|
+
<IBAN>CH5481230000001998736</IBAN>
|
35
|
+
</Id>
|
36
|
+
</DbtrAcct>
|
37
|
+
<DbtrAgt>
|
38
|
+
<FinInstnId>
|
39
|
+
<BIC>RAIFCH22</BIC>
|
40
|
+
</FinInstnId>
|
41
|
+
</DbtrAgt>
|
42
|
+
<CdtTrfTxInf>
|
43
|
+
<PmtId>
|
44
|
+
<InstrId>INSTRID-01-01</InstrId>
|
45
|
+
<EndToEndId>ENDTOENDID-001</EndToEndId>
|
46
|
+
</PmtId>
|
47
|
+
<PmtTpInf>
|
48
|
+
<LclInstrm>
|
49
|
+
<Prtry>CH01</Prtry>
|
50
|
+
</LclInstrm>
|
51
|
+
</PmtTpInf>
|
52
|
+
<Amt>
|
53
|
+
<InstdAmt Ccy="CHF">3949.75</InstdAmt>
|
54
|
+
</Amt>
|
55
|
+
<CdtrAcct>
|
56
|
+
<Id>
|
57
|
+
<Othr>
|
58
|
+
<Id>01-39139-1</Id>
|
59
|
+
</Othr>
|
60
|
+
</Id>
|
61
|
+
</CdtrAcct>
|
62
|
+
<RmtInf>
|
63
|
+
<Strd>
|
64
|
+
<CdtrRefInf>
|
65
|
+
<Ref>210000000003139471430009017</Ref>
|
66
|
+
</CdtrRefInf>
|
67
|
+
</Strd>
|
68
|
+
</RmtInf>
|
69
|
+
</CdtTrfTxInf>
|
70
|
+
</PmtInf>
|
71
|
+
<PmtInf>
|
72
|
+
<PmtInfId>PMTINF-02</PmtInfId>
|
73
|
+
<PmtMtd>TRF</PmtMtd>
|
74
|
+
<BtchBookg>true</BtchBookg>
|
75
|
+
<ReqdExctnDt>2010-02-18</ReqdExctnDt>
|
76
|
+
<Dbtr>
|
77
|
+
<Nm>MUSTER AG</Nm>
|
78
|
+
<PstlAdr>
|
79
|
+
<Ctry>CH</Ctry>
|
80
|
+
<AdrLine>SELDWYLA</AdrLine>
|
81
|
+
</PstlAdr>
|
82
|
+
</Dbtr>
|
83
|
+
<DbtrAcct>
|
84
|
+
<Id>
|
85
|
+
<IBAN>CH5481230000001998736</IBAN>
|
86
|
+
</Id>
|
87
|
+
</DbtrAcct>
|
88
|
+
<DbtrAgt>
|
89
|
+
<FinInstnId>
|
90
|
+
<BIC>RAIFCH22</BIC>
|
91
|
+
</FinInstnId>
|
92
|
+
</DbtrAgt>
|
93
|
+
<CdtTrfTxInf>
|
94
|
+
<PmtId>
|
95
|
+
<InstrId>INSTRID-02-01</InstrId>
|
96
|
+
<EndToEndId>ENDTOENDID-002</EndToEndId>
|
97
|
+
</PmtId>
|
98
|
+
<PmtTpInf>
|
99
|
+
<LclInstrm>
|
100
|
+
<Prtry>CH02</Prtry>
|
101
|
+
</LclInstrm>
|
102
|
+
</PmtTpInf>
|
103
|
+
<Amt>
|
104
|
+
<InstdAmt Ccy="CHF">8479.25</InstdAmt>
|
105
|
+
</Amt>
|
106
|
+
<Cdtr>
|
107
|
+
<Nm>Robert Scheider SA</Nm>
|
108
|
+
<PstlAdr>
|
109
|
+
<StrtNm>Rue de la gare</StrtNm>
|
110
|
+
<BldgNb>24</BldgNb>
|
111
|
+
<PstCd>2501</PstCd>
|
112
|
+
<TwnNm>Biel</TwnNm>
|
113
|
+
<Ctry>CH</Ctry>
|
114
|
+
</PstlAdr>
|
115
|
+
</Cdtr>
|
116
|
+
<CdtrAcct>
|
117
|
+
<Id>
|
118
|
+
<Othr>
|
119
|
+
<Id>25-9034-2</Id>
|
120
|
+
</Othr>
|
121
|
+
</Id>
|
122
|
+
</CdtrAcct>
|
123
|
+
<RmtInf>
|
124
|
+
<Ustrd>Rechnung Nr. 408</Ustrd>
|
125
|
+
</RmtInf>
|
126
|
+
</CdtTrfTxInf>
|
127
|
+
<CdtTrfTxInf>
|
128
|
+
<PmtId>
|
129
|
+
<InstrId>INSTRID-02-02</InstrId>
|
130
|
+
<EndToEndId>ENDTOENDID-003</EndToEndId>
|
131
|
+
</PmtId>
|
132
|
+
<PmtTpInf>
|
133
|
+
<SvcLvl>
|
134
|
+
<Cd>SEPA</Cd>
|
135
|
+
</SvcLvl>
|
136
|
+
</PmtTpInf>
|
137
|
+
<Amt>
|
138
|
+
<InstdAmt Ccy="EUR">3421.00</InstdAmt>
|
139
|
+
</Amt>
|
140
|
+
<CdtrAgt>
|
141
|
+
<FinInstnId>
|
142
|
+
<BIC>DEUTDEFF</BIC>
|
143
|
+
</FinInstnId>
|
144
|
+
</CdtrAgt>
|
145
|
+
<Cdtr>
|
146
|
+
<Nm>Peter Haller</Nm>
|
147
|
+
<PstlAdr>
|
148
|
+
<AdrLine>Rosenauweg 4</AdrLine>
|
149
|
+
<AdrLine>DE-80036 München</AdrLine>
|
150
|
+
</PstlAdr>
|
151
|
+
</Cdtr>
|
152
|
+
<CdtrAcct>
|
153
|
+
<Id>
|
154
|
+
<IBAN>DE62007620110623852957</IBAN>
|
155
|
+
</Id>
|
156
|
+
</CdtrAcct>
|
157
|
+
<RmtInf>
|
158
|
+
<Strd>
|
159
|
+
<CdtrRefInf>
|
160
|
+
<Tp>
|
161
|
+
<CdOrPrtry>
|
162
|
+
<Cd>SCOR</Cd>
|
163
|
+
</CdOrPrtry>
|
164
|
+
</Tp>
|
165
|
+
<Ref>RF712348231</Ref>
|
166
|
+
</CdtrRefInf>
|
167
|
+
</Strd>
|
168
|
+
</RmtInf>
|
169
|
+
</CdtTrfTxInf>
|
170
|
+
</PmtInf>
|
171
|
+
</CstmrCdtTrfInitn>
|
172
|
+
</Document>
|