cfonb 0.0.0 → 0.0.2

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.
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cfonb'
4
+
5
+ describe CFONB::LineParser::OperationDetail do
6
+ describe '.initialize' do
7
+ subject(:line) { described_class.new(input) }
8
+
9
+ let(:input) do
10
+ '0515589916201020EUR2 98765432100B1150519 LIBMENSUEAUHTR13133 '
11
+ end
12
+
13
+ it 'correctly parses a line' do
14
+ expect(line).to have_attributes(
15
+ 'code' => '05',
16
+ 'bank' => '15589',
17
+ 'branch' => '01020',
18
+ 'currency' => 'EUR',
19
+ 'scale' => 2,
20
+ 'account' => '98765432100',
21
+ 'date' => Date.new(2019, 5, 15),
22
+ 'internal_operation_code' => '9162',
23
+ 'interbank_operation_code' => 'B1',
24
+ 'detail_code' => 'LIB',
25
+ 'detail' => 'MENSUEAUHTR13133'
26
+ )
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cfonb'
4
+
5
+ describe CFONB::LineParser::Operation do
6
+ describe '.initialize' do
7
+ subject(:line) { described_class.new(input) }
8
+
9
+ let(:input) do
10
+ '0415589916201020EUR2 98765432100B115051964160519PRLV SEPA TEST CABINET 7654321UP0000000000322JXYZ123 '
11
+ end
12
+
13
+ it 'correctly parses a line' do
14
+ expect(line).to have_attributes(
15
+ 'code' => '04',
16
+ 'bank' => '15589',
17
+ 'branch' => '01020',
18
+ 'currency' => 'EUR',
19
+ 'scale' => 2,
20
+ 'account' => '98765432100',
21
+ 'date' => Date.new(2019, 5, 15),
22
+ 'amount' => -32.21,
23
+ 'internal_operation_code' => '9162',
24
+ 'interbank_operation_code' => 'B1',
25
+ 'rejection_code' => '64',
26
+ 'value_date' => Date.new(2019, 5, 16),
27
+ 'label' => 'PRLV SEPA TEST CABINET',
28
+ 'number' => 7_654_321,
29
+ 'exoneration_code' => 'U',
30
+ 'unavailability_code' => 'P',
31
+ 'reference' => 'XYZ123'
32
+ )
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cfonb'
4
+
5
+ describe CFONB::LineParser::PreviousBalance do
6
+ describe '.initialize' do
7
+ subject(:line) { described_class.new(input) }
8
+
9
+ let(:input) do
10
+ '0115589 01020EUR2 98765432100 150519 0000000001904L150519160519 '
11
+ end
12
+
13
+ it 'correctly parses a line' do
14
+ expect(line).to have_attributes(
15
+ 'code' => '01',
16
+ 'bank' => '15589',
17
+ 'branch' => '01020',
18
+ 'currency' => 'EUR',
19
+ 'scale' => 2,
20
+ 'account' => '98765432100',
21
+ 'date' => Date.new(2019, 5, 15),
22
+ 'amount' => -190.43
23
+ )
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,184 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cfonb'
4
+ require 'ostruct'
5
+
6
+ describe CFONB::Operation do
7
+ subject(:operation) { described_class.new(line) }
8
+
9
+ let(:line) do
10
+ OpenStruct.new(
11
+ body: 'xxxxxxxxxxxxxx',
12
+ label: 'A random operation label',
13
+ date: Date.new(2021, 3, 5),
14
+ currency: 'EUR',
15
+ amount: -15,
16
+ reference: '42'
17
+ )
18
+ end
19
+
20
+ describe '#merge_detail' do
21
+ it 'merges the lines body' do
22
+ detail = OpenStruct.new(body: 'yyyyyyyyyyyyyy')
23
+ operation.merge_detail(detail)
24
+
25
+ expect(operation.raw).to eq(<<~TXT.strip)
26
+ xxxxxxxxxxxxxx
27
+ yyyyyyyyyyyyyy
28
+ TXT
29
+ end
30
+
31
+ context 'with a LIB detail' do
32
+ let(:detail) { OpenStruct.new(body: '', detail_code: 'LIB', detail: ' Extra label ') }
33
+
34
+ it 'Adds the new label line' do
35
+ operation.merge_detail(detail)
36
+
37
+ expect(operation.label).to eq(<<~TXT.strip)
38
+ A random operation label
39
+ Extra label
40
+ TXT
41
+ end
42
+ end
43
+
44
+ context 'with a LCC detail' do
45
+ let(:detail) { OpenStruct.new(body: '', detail_code: 'LCC', detail: ' Extra label ') }
46
+
47
+ it 'Adds the new label line' do
48
+ operation.merge_detail(detail)
49
+
50
+ expect(operation.label).to eq(<<~TXT.strip)
51
+ A random operation label
52
+ Extra label
53
+ TXT
54
+ end
55
+ end
56
+
57
+ context 'with a LC2 detail' do
58
+ let(:detail) { OpenStruct.new(body: '', detail_code: 'LC2', detail: ' Extra label ') }
59
+
60
+ it 'Adds the new label line' do
61
+ operation.merge_detail(detail)
62
+
63
+ expect(operation.label).to eq(<<~TXT.strip)
64
+ A random operation label
65
+ Extra label
66
+ TXT
67
+ end
68
+ end
69
+
70
+ context 'with a LCS detail' do
71
+ let(:detail) { OpenStruct.new(body: '', detail_code: 'LCS', detail: ' Extra label ') }
72
+
73
+ it 'Adds the new label line' do
74
+ operation.merge_detail(detail)
75
+
76
+ expect(operation.label).to eq(<<~TXT.strip)
77
+ A random operation label
78
+ Extra label
79
+ TXT
80
+ end
81
+ end
82
+
83
+ context 'with a MMO detail' do
84
+ let(:detail) { OpenStruct.new(body: '', detail_code: 'MMO', detail: 'USD200000000001234') }
85
+
86
+ it 'Adds the original currency information' do
87
+ operation.merge_detail(detail)
88
+
89
+ expect(operation).to have_attributes(
90
+ original_currency: 'USD',
91
+ original_amount: -12.34
92
+ )
93
+ end
94
+ end
95
+
96
+ context 'with a NPY detail' do
97
+ let(:detail) { OpenStruct.new(body: '', detail_code: 'NPY', detail: 'Patrick') }
98
+
99
+ it 'Adds the debtor information' do
100
+ operation.merge_detail(detail)
101
+
102
+ expect(operation).to have_attributes(debtor: 'Patrick')
103
+ end
104
+ end
105
+
106
+ context 'with a NBE detail' do
107
+ let(:detail) { OpenStruct.new(body: '', detail_code: 'NBE', detail: 'Jean-Pierre') }
108
+
109
+ it 'Adds the creditor information' do
110
+ operation.merge_detail(detail)
111
+
112
+ expect(operation).to have_attributes(creditor: 'Jean-Pierre')
113
+ end
114
+ end
115
+
116
+ context 'with a RCN detail' do
117
+ let(:detail) do
118
+ OpenStruct.new(
119
+ body: '',
120
+ detail_code: 'RCN',
121
+ detail: 'SWILE-CMD-TR-YPDHMA TICKET RESTO '
122
+ )
123
+ end
124
+
125
+ it 'adds the reference information' do
126
+ operation.merge_detail(detail)
127
+
128
+ expect(operation.reference).to eq('42 - SWILE-CMD-TR-YPDHMA')
129
+ expect(operation.purpose).to eq('TICKET RESTO')
130
+ end
131
+ end
132
+
133
+ context 'with a REF detail' do
134
+ let(:detail) do
135
+ OpenStruct.new(
136
+ body: '0530002112701731EUR2E0000073337DA129082300 REFPENNYLANE B13A93908C36C82DF5C319/1 ',
137
+ detail_code: 'REF',
138
+ detail: 'PENNYLANE B13A93908C36C82DF5C319/1 '
139
+ )
140
+ end
141
+
142
+ it 'adds the reference information' do
143
+ operation.merge_detail(detail)
144
+
145
+ expect(operation.reference).to eq('42 - PENNYLANE B13A93908C36C82DF5C319/1')
146
+ end
147
+ end
148
+
149
+ context 'with a FEE detail' do
150
+ let(:detail) do
151
+ OpenStruct.new(
152
+ body: '0530004411001871EUR2 0001016255614090823 FEEEUR200000000000740',
153
+ detail_code: 'FEE',
154
+ detail: 'EUR200000000000740'
155
+ )
156
+ end
157
+
158
+ it 'adds the fee information' do
159
+ operation.merge_detail(detail)
160
+
161
+ expect(operation.fee_currency).to eq('EUR')
162
+ expect(operation.fee).to eq(-7.4)
163
+ end
164
+ end
165
+ end
166
+
167
+ describe '#type_code' do
168
+ context 'with positive amount' do
169
+ let(:line) { OpenStruct.new(amount: -15, interbank_operation_code: '15', label: 'a label') }
170
+
171
+ it 'returns a debit transaction type code' do
172
+ expect(operation.type_code).to eq('15D')
173
+ end
174
+ end
175
+
176
+ context 'with negative amount' do
177
+ let(:line) { OpenStruct.new(amount: 15, interbank_operation_code: '2B', label: 'a label') }
178
+
179
+ it 'returns a credit transaction type code' do
180
+ expect(operation.type_code).to eq('2BC')
181
+ end
182
+ end
183
+ end
184
+ end