sps_king 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,240 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+ (C) Copyright 2015, SIX Interbank Clearing AG, www.iso-payments.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.008.001.02.ch.03.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.six-interbank-clearing.com/de/pain.008.001.02.ch.03.xsd pain.008.001.02.ch.03.xsd">
10
+ <CstmrDrctDbtInitn>
11
+ <GrpHdr>
12
+ <MsgId>MSG-01</MsgId>
13
+ <CreDtTm>2015-03-23T07:30:00</CreDtTm>
14
+ <NbOfTxs>3</NbOfTxs>
15
+ <CtrlSum>4372.50</CtrlSum>
16
+ <InitgPty>
17
+ <Nm>MUSTER AG</Nm>
18
+ <Id>
19
+ <OrgId>
20
+ <Othr>
21
+ <Id>ABC1W</Id>
22
+ </Othr>
23
+ </OrgId>
24
+ </Id>
25
+ </InitgPty>
26
+ </GrpHdr>
27
+ <PmtInf>
28
+ <PmtInfId>PMTINF-01</PmtInfId>
29
+ <PmtMtd>DD</PmtMtd>
30
+ <PmtTpInf>
31
+ <SvcLvl>
32
+ <Prtry>CHTA</Prtry>
33
+ </SvcLvl>
34
+ <LclInstrm>
35
+ <Prtry>LSV+</Prtry>
36
+ </LclInstrm>
37
+ </PmtTpInf>
38
+ <ReqdColltnDt>2015-03-30</ReqdColltnDt>
39
+ <Cdtr>
40
+ <Nm>MUSTER AG</Nm>
41
+ <PstlAdr>
42
+ <Ctry>CH</Ctry>
43
+ <AdrLine>SELDWYLA</AdrLine>
44
+ </PstlAdr>
45
+ </Cdtr>
46
+ <CdtrAcct>
47
+ <Id>
48
+ <IBAN>CH7081232000001998736</IBAN>
49
+ </Id>
50
+ </CdtrAcct>
51
+ <CdtrAgt>
52
+ <FinInstnId>
53
+ <ClrSysMmbId>
54
+ <MmbId>81232</MmbId>
55
+ </ClrSysMmbId>
56
+ <Othr>
57
+ <Id>010001456</Id>
58
+ </Othr>
59
+ </FinInstnId>
60
+ </CdtrAgt>
61
+ <CdtrSchmeId>
62
+ <Id>
63
+ <PrvtId>
64
+ <Othr>
65
+ <Id>ABC1W</Id>
66
+ <SchmeNm>
67
+ <Prtry>CHLS</Prtry>
68
+ </SchmeNm>
69
+ </Othr>
70
+ </PrvtId>
71
+ </Id>
72
+ </CdtrSchmeId>
73
+ <DrctDbtTxInf>
74
+ <PmtId>
75
+ <InstrId>INSTRID-01-01</InstrId>
76
+ <EndToEndId>NOTPROVIDED</EndToEndId>
77
+ </PmtId>
78
+ <InstdAmt Ccy="CHF">3421.00</InstdAmt>
79
+ <DbtrAgt>
80
+ <FinInstnId>
81
+ <ClrSysMmbId>
82
+ <MmbId>4835</MmbId>
83
+ </ClrSysMmbId>
84
+ </FinInstnId>
85
+ </DbtrAgt>
86
+ <Dbtr>
87
+ <Nm>HERR PETER HALLER</Nm>
88
+ <PstlAdr>
89
+ <Ctry>CH</Ctry>
90
+ <AdrLine>ROSENAUWEG 4</AdrLine>
91
+ <AdrLine>8004 ZÜRICH</AdrLine>
92
+ </PstlAdr>
93
+ </Dbtr>
94
+ <DbtrAcct>
95
+ <Id>
96
+ <IBAN>CH9804835011062385295</IBAN>
97
+ </Id>
98
+ </DbtrAcct>
99
+ <RmtInf>
100
+ <Strd>
101
+ <CdtrRefInf>
102
+ <Tp>
103
+ <CdOrPrtry>
104
+ <Prtry>ESR</Prtry>
105
+ </CdOrPrtry>
106
+ </Tp>
107
+ <Ref>200002000000004443332000061</Ref>
108
+ </CdtrRefInf>
109
+ </Strd>
110
+ </RmtInf>
111
+ </DrctDbtTxInf>
112
+ </PmtInf>
113
+ <PmtInf>
114
+ <PmtInfId>PMTINF-02</PmtInfId>
115
+ <PmtMtd>DD</PmtMtd>
116
+ <PmtTpInf>
117
+ <SvcLvl>
118
+ <Prtry>CHTA</Prtry>
119
+ </SvcLvl>
120
+ <LclInstrm>
121
+ <Prtry>LSV+</Prtry>
122
+ </LclInstrm>
123
+ </PmtTpInf>
124
+ <ReqdColltnDt>2015-03-25</ReqdColltnDt>
125
+ <Cdtr>
126
+ <Nm>MUSTER AG</Nm>
127
+ <PstlAdr>
128
+ <Ctry>CH</Ctry>
129
+ <AdrLine>SELDWYLA</AdrLine>
130
+ </PstlAdr>
131
+ </Cdtr>
132
+ <CdtrAcct>
133
+ <Id>
134
+ <IBAN>CH7081232000001998736</IBAN>
135
+ </Id>
136
+ </CdtrAcct>
137
+ <CdtrAgt>
138
+ <FinInstnId>
139
+ <ClrSysMmbId>
140
+ <MmbId>81232</MmbId>
141
+ </ClrSysMmbId>
142
+ <Othr>
143
+ <Id>010001456</Id>
144
+ </Othr>
145
+ </FinInstnId>
146
+ </CdtrAgt>
147
+ <CdtrSchmeId>
148
+ <Id>
149
+ <PrvtId>
150
+ <Othr>
151
+ <Id>ABC1W</Id>
152
+ <SchmeNm>
153
+ <Prtry>CHLS</Prtry>
154
+ </SchmeNm>
155
+ </Othr>
156
+ </PrvtId>
157
+ </Id>
158
+ </CdtrSchmeId>
159
+ <DrctDbtTxInf>
160
+ <PmtId>
161
+ <InstrId>INSTRID-02-01</InstrId>
162
+ <EndToEndId>NOTPROVIDED</EndToEndId>
163
+ </PmtId>
164
+ <InstdAmt Ccy="CHF">885.50</InstdAmt>
165
+ <DbtrAgt>
166
+ <FinInstnId>
167
+ <ClrSysMmbId>
168
+ <MmbId>4835</MmbId>
169
+ </ClrSysMmbId>
170
+ </FinInstnId>
171
+ </DbtrAgt>
172
+ <Dbtr>
173
+ <Nm>HANS TESTER</Nm>
174
+ <PstlAdr>
175
+ <Ctry>CH</Ctry>
176
+ <AdrLine>PROBEWEG 88</AdrLine>
177
+ <AdrLine>9998 IRGENDWO</AdrLine>
178
+ </PstlAdr>
179
+ </Dbtr>
180
+ <DbtrAcct>
181
+ <Id>
182
+ <IBAN>CH9804835011062385295</IBAN>
183
+ </Id>
184
+ </DbtrAcct>
185
+ <RmtInf>
186
+ <Ustrd>Gemäss Rechnung 4712</Ustrd>
187
+ <Strd>
188
+ <CdtrRefInf>
189
+ <Tp>
190
+ <CdOrPrtry>
191
+ <Prtry>ESR</Prtry>
192
+ </CdOrPrtry>
193
+ </Tp>
194
+ <Ref>185744810000000000200800628</Ref>
195
+ </CdtrRefInf>
196
+ </Strd>
197
+ </RmtInf>
198
+ </DrctDbtTxInf>
199
+ <DrctDbtTxInf>
200
+ <PmtId>
201
+ <InstrId>INSTRID-02-02</InstrId>
202
+ <EndToEndId>NOTPROVIDED</EndToEndId>
203
+ </PmtId>
204
+ <InstdAmt Ccy="CHF">66.00</InstdAmt>
205
+ <DbtrAgt>
206
+ <FinInstnId>
207
+ <ClrSysMmbId>
208
+ <MmbId>700</MmbId>
209
+ </ClrSysMmbId>
210
+ </FinInstnId>
211
+ </DbtrAgt>
212
+ <Dbtr>
213
+ <Nm>PETER ERROR</Nm>
214
+ <PstlAdr>
215
+ <Ctry>CH</Ctry>
216
+ <AdrLine>Rudolfsweg 11</AdrLine>
217
+ <AdrLine>Sion</AdrLine>
218
+ </PstlAdr>
219
+ </Dbtr>
220
+ <DbtrAcct>
221
+ <Id>
222
+ <IBAN>CH2007000031023502601</IBAN>
223
+ </Id>
224
+ </DbtrAcct>
225
+ <RmtInf>
226
+ <Strd>
227
+ <CdtrRefInf>
228
+ <Tp>
229
+ <CdOrPrtry>
230
+ <Prtry>ESR</Prtry>
231
+ </CdOrPrtry>
232
+ </Tp>
233
+ <Ref>215703000075200334559000126</Ref>
234
+ </CdtrRefInf>
235
+ </Strd>
236
+ </RmtInf>
237
+ </DrctDbtTxInf>
238
+ </PmtInf>
239
+ </CstmrDrctDbtInitn>
240
+ </Document>
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe SPS::CreditorAccount do
5
+ it 'should initialize a new account' do
6
+ expect(
7
+ SPS::CreditorAccount.new(
8
+ name: 'Gläubiger GmbH',
9
+ bic: 'BANKDEFFXXX',
10
+ iban: 'DE87200500001234567890',
11
+ creditor_identifier: 'DE98ZZZ09999999999'
12
+ )
13
+ ).to be_valid
14
+ end
15
+
16
+ describe :creditor_identifier do
17
+ it 'should accept valid value' do
18
+ expect(SPS::CreditorAccount)
19
+ .to accept(
20
+ 'DE98ZZZ09999999999',
21
+ 'AT12ZZZ00000000001',
22
+ 'IT97ZZZA1B2C3D4E5F6G7H8',
23
+ 'NL97ZZZ123456780001',
24
+ 'FR12ZZZ123456',
25
+ for: :creditor_identifier
26
+ )
27
+ end
28
+
29
+ it 'should not accept invalid value' do
30
+ expect(SPS::CreditorAccount)
31
+ .not_to accept(
32
+ '',
33
+ 'invalid',
34
+ 'DE98ZZZ099999999990',
35
+ 'DEAAAAAAAAAAAAAAAA',
36
+ for: :creditor_identifier
37
+ )
38
+ end
39
+ end
40
+
41
+ describe :isr_participant_number do
42
+ it 'should accept valid value' do
43
+ expect(SPS::CreditorAccount)
44
+ .to accept('123123123', '554544543', nil, for: :isr_participant_number)
45
+ end
46
+
47
+ it 'should not accept invalid value' do
48
+ expect(SPS::CreditorAccount)
49
+ .not_to accept('32423432', 'a89898989', for: :isr_participant_number)
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe SPS::CreditorAddress do
5
+ it 'should initialize a new address' do
6
+ expect(
7
+ SPS::CreditorAddress.new(
8
+ country_code: 'CH',
9
+ address_line1: 'Mustergasse 123',
10
+ address_line2: '12345 Musterstadt'
11
+ )
12
+ ).to be_valid
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe SPS::DebtorAccount do
5
+ it 'should initialize a new account' do
6
+ expect(
7
+ SPS::DebtorAccount.new(
8
+ name: 'Gläubiger GmbH',
9
+ bic: 'BANKDEFFXXX',
10
+ iban: 'DE87200500001234567890'
11
+ )
12
+ ).to be_valid
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe SPS::DebtorAddress do
5
+ it 'should initialize a new address' do
6
+ expect(
7
+ SPS::DebtorAddress.new(
8
+ country_code: 'CH',
9
+ address_line1: 'Mustergasse 123',
10
+ address_line2: '12345 Musterstadt'
11
+ )
12
+ ).to be_valid
13
+ end
14
+ end
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe SPS::Account do
5
+ describe :new do
6
+ it 'should not accept unknown keys' do
7
+ expect {
8
+ SPS::Account.new foo: 'bar'
9
+ }.to raise_error(NoMethodError)
10
+ end
11
+ end
12
+
13
+ describe :name do
14
+ it 'should accept valid value' do
15
+ expect(SPS::Account).to accept('Gläubiger GmbH', 'Zahlemann & Söhne GbR', 'X' * 70, for: :name)
16
+ end
17
+
18
+ it 'should not accept invalid value' do
19
+ expect(SPS::Account).not_to accept(nil, '', 'X' * 71, for: :name)
20
+ end
21
+ end
22
+
23
+ describe :iban do
24
+ it 'should accept valid value' do
25
+ expect(SPS::Account).to accept('DE21500500009876543210', 'PL61109010140000071219812874', for: :iban)
26
+ end
27
+
28
+ it 'should not accept invalid value' do
29
+ expect(SPS::Account).not_to accept(nil, '', 'invalid', for: :iban)
30
+ end
31
+ end
32
+
33
+ describe :bic do
34
+ it 'should accept valid value' do
35
+ expect(SPS::Account).to accept('DEUTDEFF', 'DEUTDEFF500', 'SPUEDE2UXXX', for: :bic)
36
+ end
37
+
38
+ it 'should not accept invalid value' do
39
+ expect(SPS::Account).not_to accept('', 'invalid', for: :bic)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,88 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe SPS::Converter do
5
+ include SPS::Converter::InstanceMethods
6
+
7
+ describe :convert do
8
+ context 'when the conversion method does not exist' do
9
+ it 'raises an ArgumentError' do
10
+ class DummyForConverter
11
+ extend SPS::Converter
12
+ end
13
+
14
+ expect {
15
+ DummyForConverter.convert(:anything, to: :unknown)
16
+ }.to raise_error(ArgumentError, "Converter 'unknown' does not exist!")
17
+ end
18
+ end
19
+ end
20
+
21
+ describe :convert_text do
22
+ it 'should convert special chars' do
23
+ expect(convert_text('10€')).to eq('10E')
24
+ expect(convert_text('info@bundesbank.de')).to eq('info(at)bundesbank.de')
25
+ expect(convert_text('abc_def')).to eq('abc-def')
26
+ end
27
+
28
+ it 'should not change allowed special character' do
29
+ expect(convert_text('üöäÜÖÄß')).to eq('üöäÜÖÄß')
30
+ expect(convert_text('&*$%')).to eq('&*$%')
31
+ end
32
+
33
+ it 'should convert line breaks' do
34
+ expect(convert_text("one\ntwo")) .to eq('one two')
35
+ expect(convert_text("one\ntwo\n")) .to eq('one two')
36
+ expect(convert_text("\none\ntwo\n")).to eq('one two')
37
+ expect(convert_text("one\n\ntwo")) .to eq('one two')
38
+ end
39
+
40
+ it 'should convert number' do
41
+ expect(convert_text(1234)).to eq('1234')
42
+ end
43
+
44
+ it 'should remove invalid chars' do
45
+ expect(convert_text('"=<>!')).to eq('')
46
+ end
47
+
48
+ it 'should not touch valid chars' do
49
+ expect(convert_text("abc-ABC-0123- ':?,-(+.)/")).to eq("abc-ABC-0123- ':?,-(+.)/")
50
+ end
51
+
52
+ it 'should not touch nil' do
53
+ expect(convert_text(nil)).to eq(nil)
54
+ end
55
+ end
56
+
57
+ describe :convert_decimal do
58
+ it "should convert Integer to BigDecimal" do
59
+ expect(convert_decimal(42)).to eq(BigDecimal('42.00'))
60
+ end
61
+
62
+ it "should convert Float to BigDecimal" do
63
+ expect(convert_decimal(42.12)).to eq(BigDecimal('42.12'))
64
+ end
65
+
66
+ it 'should round' do
67
+ expect(convert_decimal(1.345)).to eq(BigDecimal('1.35'))
68
+ end
69
+
70
+ it 'should not touch nil' do
71
+ expect(convert_decimal(nil)).to eq(nil)
72
+ end
73
+
74
+ it 'should not convert zero value' do
75
+ expect(convert_decimal(0)).to eq(nil)
76
+ end
77
+
78
+ it 'should not convert negative value' do
79
+ expect(convert_decimal(-3)).to eq(nil)
80
+ end
81
+
82
+ it 'should not convert invalid value' do
83
+ expect(convert_decimal('xyz')).to eq(nil)
84
+ expect(convert_decimal('NaN')).to eq(nil)
85
+ expect(convert_decimal('Infinity')).to eq(nil)
86
+ end
87
+ end
88
+ end