Skip to content

Commit

Permalink
Return unknown operation_details in parser
Browse files Browse the repository at this point in the history
  • Loading branch information
joanabertoldi committed Nov 27, 2024
1 parent b6fef0c commit 3f73c2b
Show file tree
Hide file tree
Showing 6 changed files with 58 additions and 1 deletion.
1 change: 1 addition & 0 deletions lib/cfonb.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
require_relative 'cfonb/operation_details/ibe'
require_relative 'cfonb/operation_details/npo'
require_relative 'cfonb/operation_details/nbu'
require_relative 'cfonb/operation_details/unknown'

module CFONB
def self.parse(input, optimistic: false)
Expand Down
3 changes: 2 additions & 1 deletion lib/cfonb/operation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,9 @@ def initialize(line)

def merge_detail(line)
self.raw += "\n#{line.body}"
operation_details = OperationDetails.for(line) || OperationDetails::Unknown

OperationDetails.for(line)&.apply(details, line)
operation_details.apply(details, line)
end

def type_code
Expand Down
23 changes: 23 additions & 0 deletions lib/cfonb/operation_details/unknown.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# frozen_string_literal: true

module CFONB
module OperationDetails
class Unknown
ATTRIBUTES = %i[unknown].freeze

def self.apply(details, line)
return unless line.respond_to?(:detail)

details.unknown ||= {}
code = line.detail_code

details.unknown[code] =
[details.unknown[code], line.detail.strip].compact.join("\n")

details.instance_variable_set(:"@#{code}", details.unknown[code])
end

CFONB::OperationDetails.register('Unknown', self)
end
end
end
23 changes: 23 additions & 0 deletions spec/cfonb/operation_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,29 @@
expect(operation.details.ultimate_creditor).to eq('Patrick')
end
end

context 'with an unknown detail' do
let(:detail) do
OpenStruct.new(
body: '0530004411001871EUR2 0001016255614090823 AAAEUR200000000000740',
detail_code: 'AAA',
detail: 'EUR200000000000740',
)
end

it 'adds the detail to the unknown details hash' do
operation.merge_detail(detail)

expect(operation.details.unknown).to eq({ 'AAA' => 'EUR200000000000740' })
end

it 'updates the current details in case of duplicated codes' do
operation.merge_detail(detail)
operation.merge_detail(detail)

expect(operation.details.unknown).to eq({ 'AAA' => "EUR200000000000740\nEUR200000000000740" })
end
end
end

describe '#type_code' do
Expand Down
5 changes: 5 additions & 0 deletions spec/cfonb/parser_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@
exchange_rate: nil,
purpose: 'PURPOSE',
debtor: 'INTERNET SFR',
unknown: {
'AAA' => "INTERNETA AAA\nINTERNETA ABB",
'BBB' => 'INTERNETE BBB',
'CCC' => 'INTERNETI CCC',
},
)

expect(statements[0].operations[1]).to have_attributes(
Expand Down
4 changes: 4 additions & 0 deletions spec/files/example.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
0515589916200000EUR2 98765432100B1160519 REFREFERENCE
0515589916200000EUR2 98765432100B1160519 RCNOTHER REFERENCE PURPOSE
0515589916200000EUR2 98765432100B1160519 NPYINTERNET SFR
0515589916200000EUR2 98765432100B1160519 AAAINTERNETA AAA
0515589916200000EUR2 98765432100B1160519 AAAINTERNETA ABB
0515589916200000EUR2 98765432100B1160519 BBBINTERNETE BBB
0515589916200000EUR2 98765432100B1160519 CCCINTERNETI CCC

0415589916200000EUR2 98765432100B1160519 160519VIR SEPA DEMONSTRATION 0000000000000000000107}REFERENCE
0515589916200000EUR2 98765432100B1160519 NPYELEC ERDF
Expand Down

0 comments on commit 3f73c2b

Please sign in to comment.