From 3f73c2bfc8488b77b27f39b98fd4bc404de9119b Mon Sep 17 00:00:00 2001 From: Joana Bertoldi Date: Wed, 27 Nov 2024 18:02:47 +0000 Subject: [PATCH] Return unknown operation_details in parser --- lib/cfonb.rb | 1 + lib/cfonb/operation.rb | 3 ++- lib/cfonb/operation_details/unknown.rb | 23 +++++++++++++++++++++++ spec/cfonb/operation_spec.rb | 23 +++++++++++++++++++++++ spec/cfonb/parser_spec.rb | 5 +++++ spec/files/example.txt | 4 ++++ 6 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 lib/cfonb/operation_details/unknown.rb diff --git a/lib/cfonb.rb b/lib/cfonb.rb index 24c7d6d..e7be641 100644 --- a/lib/cfonb.rb +++ b/lib/cfonb.rb @@ -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) diff --git a/lib/cfonb/operation.rb b/lib/cfonb/operation.rb index 44180d7..4dc18c7 100644 --- a/lib/cfonb/operation.rb +++ b/lib/cfonb/operation.rb @@ -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 diff --git a/lib/cfonb/operation_details/unknown.rb b/lib/cfonb/operation_details/unknown.rb new file mode 100644 index 0000000..5fafbc5 --- /dev/null +++ b/lib/cfonb/operation_details/unknown.rb @@ -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 diff --git a/spec/cfonb/operation_spec.rb b/spec/cfonb/operation_spec.rb index d31a56f..2aff10a 100644 --- a/spec/cfonb/operation_spec.rb +++ b/spec/cfonb/operation_spec.rb @@ -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 diff --git a/spec/cfonb/parser_spec.rb b/spec/cfonb/parser_spec.rb index a6fb0eb..4a9ff0e 100644 --- a/spec/cfonb/parser_spec.rb +++ b/spec/cfonb/parser_spec.rb @@ -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( diff --git a/spec/files/example.txt b/spec/files/example.txt index 5bb62e0..3732cb2 100644 --- a/spec/files/example.txt +++ b/spec/files/example.txt @@ -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