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.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +32 -0
  5. data/CONTRIBUTING.md +38 -0
  6. data/Gemfile +2 -0
  7. data/LICENSE.txt +24 -0
  8. data/README.md +246 -0
  9. data/Rakefile +6 -0
  10. data/gemfiles/Gemfile-activemodel-3.1.x +5 -0
  11. data/gemfiles/Gemfile-activemodel-3.2.x +5 -0
  12. data/gemfiles/Gemfile-activemodel-4.0.x +5 -0
  13. data/gemfiles/Gemfile-activemodel-4.1.x +5 -0
  14. data/gemfiles/Gemfile-activemodel-4.2.x +5 -0
  15. data/gemfiles/Gemfile-activemodel-5.0.x +5 -0
  16. data/gemfiles/Gemfile-activemodel-5.1.x +5 -0
  17. data/gemfiles/Gemfile-activemodel-5.2.x +5 -0
  18. data/lib/schema/pain.001.001.03.ch.02.xsd +1212 -0
  19. data/lib/schema/pain.008.001.02.ch.03.xsd +784 -0
  20. data/lib/sps_king.rb +22 -0
  21. data/lib/sps_king/account.rb +24 -0
  22. data/lib/sps_king/account/creditor_account.rb +11 -0
  23. data/lib/sps_king/account/creditor_address.rb +37 -0
  24. data/lib/sps_king/account/debtor_account.rb +5 -0
  25. data/lib/sps_king/account/debtor_address.rb +34 -0
  26. data/lib/sps_king/converter.rb +53 -0
  27. data/lib/sps_king/error.rb +4 -0
  28. data/lib/sps_king/message.rb +163 -0
  29. data/lib/sps_king/message/credit_transfer.rb +140 -0
  30. data/lib/sps_king/message/direct_debit.rb +177 -0
  31. data/lib/sps_king/structured_remittance_information.rb +20 -0
  32. data/lib/sps_king/transaction.rb +59 -0
  33. data/lib/sps_king/transaction/credit_transfer_transaction.rb +19 -0
  34. data/lib/sps_king/transaction/direct_debit_transaction.rb +58 -0
  35. data/lib/sps_king/validator.rb +55 -0
  36. data/lib/sps_king/version.rb +3 -0
  37. data/spec/examples/pain.001.001.03.ch.02.xml +172 -0
  38. data/spec/examples/pain.008.001.02.ch.03.xml +240 -0
  39. data/spec/lib/sps_king/account/creditor_account_spec.rb +52 -0
  40. data/spec/lib/sps_king/account/creditor_address_spec.rb +14 -0
  41. data/spec/lib/sps_king/account/debtor_account_spec.rb +14 -0
  42. data/spec/lib/sps_king/account/debtor_address_spec.rb +14 -0
  43. data/spec/lib/sps_king/account_spec.rb +42 -0
  44. data/spec/lib/sps_king/converter_spec.rb +88 -0
  45. data/spec/lib/sps_king/message/credit_transfer_spec.rb +350 -0
  46. data/spec/lib/sps_king/message/direct_debit_spec.rb +483 -0
  47. data/spec/lib/sps_king/message_spec.rb +128 -0
  48. data/spec/lib/sps_king/structured_remittance_information_spec.rb +32 -0
  49. data/spec/lib/sps_king/transaction/credit_transfer_transaction_spec.rb +53 -0
  50. data/spec/lib/sps_king/transaction/direct_debit_transaction_spec.rb +56 -0
  51. data/spec/lib/sps_king/transaction_spec.rb +133 -0
  52. data/spec/lib/sps_king/validation_spec.rb +23 -0
  53. data/spec/lib/sps_king/validator_spec.rb +78 -0
  54. data/spec/spec_helper.rb +33 -0
  55. data/spec/support/active_model.rb +30 -0
  56. data/spec/support/custom_matcher.rb +60 -0
  57. data/spec/support/factories.rb +33 -0
  58. data/spec/support/validations.rb +27 -0
  59. data/sps_king.gemspec +31 -0
  60. 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,3 @@
1
+ module SPS
2
+ VERSION = '0.1.0'
3
+ 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>