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,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