diff --git a/README.md b/README.md index 8a2ff46..7ab0a18 100644 --- a/README.md +++ b/README.md @@ -29,14 +29,14 @@ gem 'cfonb' ## Available Operation Details -`OperationDetail` are lines starting with `05`. They aim at providing additional information about the operation. +`OperationDetails` are lines starting with `05`. They aim at providing additional information about the operation. Find bellow the list of additional details available for each operation. If you encouter new ones, please open an issue or a pull request with the appropriate implementation. We aimed at making it as easy as possible to add new details. You just need to do the following on initialization: ```ruby -CFONB::OperationDetail.register('FEE', self) +CFONB::OperationDetails.register('FEE', self) ``` | Detail Code | Attributes | Description | diff --git a/lib/cfonb.rb b/lib/cfonb.rb index cfbe50e..24c7d6d 100644 --- a/lib/cfonb.rb +++ b/lib/cfonb.rb @@ -8,29 +8,30 @@ require_relative 'cfonb/parser' require_relative 'cfonb/statement' require_relative 'cfonb/operation' -require_relative 'cfonb/operation_detail' +require_relative 'cfonb/operation_details' require_relative 'cfonb/line_parser' require_relative 'cfonb/line_parser/base' require_relative 'cfonb/line_parser/previous_balance' require_relative 'cfonb/line_parser/operation' -require_relative 'cfonb/line_parser/operation_detail' +require_relative 'cfonb/line_parser/operation_details' require_relative 'cfonb/line_parser/new_balance' -require_relative 'cfonb/operation_detail/lib' -require_relative 'cfonb/operation_detail/lcc' -require_relative 'cfonb/operation_detail/lc2' -require_relative 'cfonb/operation_detail/lcs' -require_relative 'cfonb/operation_detail/mmo' -require_relative 'cfonb/operation_detail/nbe' -require_relative 'cfonb/operation_detail/npy' -require_relative 'cfonb/operation_detail/ipy' -require_relative 'cfonb/operation_detail/rcn' -require_relative 'cfonb/operation_detail/ref' -require_relative 'cfonb/operation_detail/fee' -require_relative 'cfonb/operation_detail/ibe' -require_relative 'cfonb/operation_detail/npo' -require_relative 'cfonb/operation_detail/nbu' +require_relative 'cfonb/operation_details/base' +require_relative 'cfonb/operation_details/lib' +require_relative 'cfonb/operation_details/lcc' +require_relative 'cfonb/operation_details/lc2' +require_relative 'cfonb/operation_details/lcs' +require_relative 'cfonb/operation_details/mmo' +require_relative 'cfonb/operation_details/nbe' +require_relative 'cfonb/operation_details/npy' +require_relative 'cfonb/operation_details/ipy' +require_relative 'cfonb/operation_details/rcn' +require_relative 'cfonb/operation_details/ref' +require_relative 'cfonb/operation_details/fee' +require_relative 'cfonb/operation_details/ibe' +require_relative 'cfonb/operation_details/npo' +require_relative 'cfonb/operation_details/nbu' module CFONB def self.parse(input, optimistic: false) diff --git a/lib/cfonb/line_parser/operation_detail.rb b/lib/cfonb/line_parser/operation_details.rb similarity index 92% rename from lib/cfonb/line_parser/operation_detail.rb rename to lib/cfonb/line_parser/operation_details.rb index 7886339..09b2200 100644 --- a/lib/cfonb/line_parser/operation_detail.rb +++ b/lib/cfonb/line_parser/operation_details.rb @@ -2,7 +2,7 @@ module CFONB module LineParser - class OperationDetail < Base + class OperationDetails < Base DICTIONARY = [ ['internal_operation_code', (7..10)], ['interbank_operation_code', (32..33)], diff --git a/lib/cfonb/operation.rb b/lib/cfonb/operation.rb index ed7fa88..38e333f 100644 --- a/lib/cfonb/operation.rb +++ b/lib/cfonb/operation.rb @@ -38,7 +38,7 @@ def initialize(line) def merge_detail(line) self.raw += "\n#{line.body}" - OperationDetail.for(line)&.apply(self, line) + OperationDetails.for(line)&.apply(self, line) end def type_code diff --git a/lib/cfonb/operation_detail.rb b/lib/cfonb/operation_details.rb similarity index 93% rename from lib/cfonb/operation_detail.rb rename to lib/cfonb/operation_details.rb index cb408a4..c0d154f 100644 --- a/lib/cfonb/operation_detail.rb +++ b/lib/cfonb/operation_details.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module CFONB - module OperationDetail + module OperationDetails @details = {} def self.register(code, klass) diff --git a/lib/cfonb/operation_details/base.rb b/lib/cfonb/operation_details/base.rb new file mode 100644 index 0000000..8a78911 --- /dev/null +++ b/lib/cfonb/operation_details/base.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module CFONB + module OperationDetails + class Base + def self.inherited(base) + base.singleton_class.prepend( + Module.new do + def apply(operation, line) + operation.instance_variable_set(:"@#{line.detail_code}", line.detail) + + super + end + end, + ) + end + end + end +end diff --git a/lib/cfonb/operation_detail/fee.rb b/lib/cfonb/operation_details/fee.rb similarity index 76% rename from lib/cfonb/operation_detail/fee.rb rename to lib/cfonb/operation_details/fee.rb index d4b4f2a..c633fe8 100644 --- a/lib/cfonb/operation_detail/fee.rb +++ b/lib/cfonb/operation_details/fee.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true module CFONB - module OperationDetail - class FEE + module OperationDetails + class FEE < Base ATTRIBUTES = %i[fee fee_currency].freeze def self.apply(operation, line) @@ -12,7 +12,7 @@ def self.apply(operation, line) operation.fee = BigDecimal(line.detail[4..17]) / (10**scale) end - CFONB::OperationDetail.register('FEE', self) + CFONB::OperationDetails.register('FEE', self) end end end diff --git a/lib/cfonb/operation_detail/ibe.rb b/lib/cfonb/operation_details/ibe.rb similarity index 76% rename from lib/cfonb/operation_detail/ibe.rb rename to lib/cfonb/operation_details/ibe.rb index da27c4f..3e49f94 100644 --- a/lib/cfonb/operation_detail/ibe.rb +++ b/lib/cfonb/operation_details/ibe.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true module CFONB - module OperationDetail - class IBE + module OperationDetails + class IBE < Base ATTRIBUTES = %i[creditor_identifier creditor_identifier_type].freeze def self.apply(operation, line) @@ -10,7 +10,7 @@ def self.apply(operation, line) operation.creditor_identifier_type = line.detail[35..-1].strip end - CFONB::OperationDetail.register('IBE', self) + CFONB::OperationDetails.register('IBE', self) end end end diff --git a/lib/cfonb/operation_detail/ipy.rb b/lib/cfonb/operation_details/ipy.rb similarity index 76% rename from lib/cfonb/operation_detail/ipy.rb rename to lib/cfonb/operation_details/ipy.rb index 745b914..b9eb9ac 100644 --- a/lib/cfonb/operation_detail/ipy.rb +++ b/lib/cfonb/operation_details/ipy.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true module CFONB - module OperationDetail - class IPY + module OperationDetails + class IPY < Base ATTRIBUTES = %i[debtor_identifier debtor_identifier_type].freeze def self.apply(operation, line) @@ -10,7 +10,7 @@ def self.apply(operation, line) operation.debtor_identifier_type = line.detail[35..-1].strip end - CFONB::OperationDetail.register('IPY', self) + CFONB::OperationDetails.register('IPY', self) end end end diff --git a/lib/cfonb/operation_detail/lc2.rb b/lib/cfonb/operation_details/lc2.rb similarity index 62% rename from lib/cfonb/operation_detail/lc2.rb rename to lib/cfonb/operation_details/lc2.rb index 512a929..419abbd 100644 --- a/lib/cfonb/operation_detail/lc2.rb +++ b/lib/cfonb/operation_details/lc2.rb @@ -1,13 +1,13 @@ # frozen_string_literal: true module CFONB - module OperationDetail - class LC2 + module OperationDetails + class LC2 < Base def self.apply(operation, line) operation.label += "\n#{line.detail.strip}" end - CFONB::OperationDetail.register('LC2', self) + CFONB::OperationDetails.register('LC2', self) end end end diff --git a/lib/cfonb/operation_detail/lcc.rb b/lib/cfonb/operation_details/lcc.rb similarity index 62% rename from lib/cfonb/operation_detail/lcc.rb rename to lib/cfonb/operation_details/lcc.rb index 80e5774..f41df5a 100644 --- a/lib/cfonb/operation_detail/lcc.rb +++ b/lib/cfonb/operation_details/lcc.rb @@ -1,13 +1,13 @@ # frozen_string_literal: true module CFONB - module OperationDetail - class LCC + module OperationDetails + class LCC < Base def self.apply(operation, line) operation.label += "\n#{line.detail.strip}" end - CFONB::OperationDetail.register('LCC', self) + CFONB::OperationDetails.register('LCC', self) end end end diff --git a/lib/cfonb/operation_detail/lcs.rb b/lib/cfonb/operation_details/lcs.rb similarity index 63% rename from lib/cfonb/operation_detail/lcs.rb rename to lib/cfonb/operation_details/lcs.rb index b62cc1d..1a567f8 100644 --- a/lib/cfonb/operation_detail/lcs.rb +++ b/lib/cfonb/operation_details/lcs.rb @@ -1,13 +1,13 @@ # frozen_string_literal: true module CFONB - module OperationDetail - class LCS + module OperationDetails + class LCS < Base def self.apply(operation, line) operation.label += "\n#{line.detail[0..35].strip}" end - CFONB::OperationDetail.register('LCS', self) + CFONB::OperationDetails.register('LCS', self) end end end diff --git a/lib/cfonb/operation_detail/lib.rb b/lib/cfonb/operation_details/lib.rb similarity index 62% rename from lib/cfonb/operation_detail/lib.rb rename to lib/cfonb/operation_details/lib.rb index c5041b0..40f2a2e 100644 --- a/lib/cfonb/operation_detail/lib.rb +++ b/lib/cfonb/operation_details/lib.rb @@ -1,13 +1,13 @@ # frozen_string_literal: true module CFONB - module OperationDetail - class LIB + module OperationDetails + class LIB < Base def self.apply(operation, line) operation.label += "\n#{line.detail.strip}" end - CFONB::OperationDetail.register('LIB', self) + CFONB::OperationDetails.register('LIB', self) end end end diff --git a/lib/cfonb/operation_detail/mmo.rb b/lib/cfonb/operation_details/mmo.rb similarity index 88% rename from lib/cfonb/operation_detail/mmo.rb rename to lib/cfonb/operation_details/mmo.rb index d3a52ed..8a39d54 100644 --- a/lib/cfonb/operation_detail/mmo.rb +++ b/lib/cfonb/operation_details/mmo.rb @@ -3,8 +3,8 @@ require 'bigdecimal' module CFONB - module OperationDetail - class MMO + module OperationDetails + class MMO < Base ATTRIBUTES = %i[original_currency original_amount exchange_rate].freeze def self.apply(operation, line) @@ -22,7 +22,7 @@ def self.apply(operation, line) operation.exchange_rate = BigDecimal(exchange_rate_value) / (10**BigDecimal(exchange_rate_scale)) end - CFONB::OperationDetail.register('MMO', self) + CFONB::OperationDetails.register('MMO', self) end end end diff --git a/lib/cfonb/operation_detail/nbe.rb b/lib/cfonb/operation_details/nbe.rb similarity index 66% rename from lib/cfonb/operation_detail/nbe.rb rename to lib/cfonb/operation_details/nbe.rb index 676b79d..02ba66b 100644 --- a/lib/cfonb/operation_detail/nbe.rb +++ b/lib/cfonb/operation_details/nbe.rb @@ -1,15 +1,15 @@ # frozen_string_literal: true module CFONB - module OperationDetail - class NBE + module OperationDetails + class NBE < Base ATTRIBUTES = %i[creditor].freeze def self.apply(operation, line) operation.creditor = line.detail.strip end - CFONB::OperationDetail.register('NBE', self) + CFONB::OperationDetails.register('NBE', self) end end end diff --git a/lib/cfonb/operation_detail/nbu.rb b/lib/cfonb/operation_details/nbu.rb similarity index 68% rename from lib/cfonb/operation_detail/nbu.rb rename to lib/cfonb/operation_details/nbu.rb index ca18d04..c999748 100644 --- a/lib/cfonb/operation_detail/nbu.rb +++ b/lib/cfonb/operation_details/nbu.rb @@ -1,15 +1,15 @@ # frozen_string_literal: true module CFONB - module OperationDetail - class NBU + module OperationDetails + class NBU < Base ATTRIBUTES = %i[ultimate_creditor].freeze def self.apply(operation, line) operation.ultimate_creditor = line.detail.strip end - CFONB::OperationDetail.register('NBU', self) + CFONB::OperationDetails.register('NBU', self) end end end diff --git a/lib/cfonb/operation_detail/npo.rb b/lib/cfonb/operation_details/npo.rb similarity index 68% rename from lib/cfonb/operation_detail/npo.rb rename to lib/cfonb/operation_details/npo.rb index 15fd742..8a0a1f6 100644 --- a/lib/cfonb/operation_detail/npo.rb +++ b/lib/cfonb/operation_details/npo.rb @@ -1,15 +1,15 @@ # frozen_string_literal: true module CFONB - module OperationDetail - class NPO + module OperationDetails + class NPO < Base ATTRIBUTES = %i[ultimate_debtor].freeze def self.apply(operation, line) operation.ultimate_debtor = line.detail.strip end - CFONB::OperationDetail.register('NPO', self) + CFONB::OperationDetails.register('NPO', self) end end end diff --git a/lib/cfonb/operation_detail/npy.rb b/lib/cfonb/operation_details/npy.rb similarity index 66% rename from lib/cfonb/operation_detail/npy.rb rename to lib/cfonb/operation_details/npy.rb index 7d32851..7a9cd0d 100644 --- a/lib/cfonb/operation_detail/npy.rb +++ b/lib/cfonb/operation_details/npy.rb @@ -1,15 +1,15 @@ # frozen_string_literal: true module CFONB - module OperationDetail - class NPY + module OperationDetails + class NPY < Base ATTRIBUTES = %i[debtor].freeze def self.apply(operation, line) operation.debtor = line.detail.strip end - CFONB::OperationDetail.register('NPY', self) + CFONB::OperationDetails.register('NPY', self) end end end diff --git a/lib/cfonb/operation_detail/rcn.rb b/lib/cfonb/operation_details/rcn.rb similarity index 80% rename from lib/cfonb/operation_detail/rcn.rb rename to lib/cfonb/operation_details/rcn.rb index 4eb452f..e9d91f3 100644 --- a/lib/cfonb/operation_detail/rcn.rb +++ b/lib/cfonb/operation_details/rcn.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true module CFONB - module OperationDetail - class RCN + module OperationDetails + class RCN < Base using CFONB::Refinements::Strings ATTRIBUTES = %i[reference purpose].freeze @@ -16,7 +16,7 @@ def self.apply(operation, line) operation.purpose = line.detail[35..-1]&.strip end - CFONB::OperationDetail.register('RCN', self) + CFONB::OperationDetails.register('RCN', self) end end end diff --git a/lib/cfonb/operation_detail/ref.rb b/lib/cfonb/operation_details/ref.rb similarity index 76% rename from lib/cfonb/operation_detail/ref.rb rename to lib/cfonb/operation_details/ref.rb index 2e748e4..f71cf59 100644 --- a/lib/cfonb/operation_detail/ref.rb +++ b/lib/cfonb/operation_details/ref.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true module CFONB - module OperationDetail - class REF + module OperationDetails + class REF < Base using CFONB::Refinements::Strings ATTRIBUTES = %i[reference].freeze @@ -14,7 +14,7 @@ def self.apply(operation, line) ].filter_map(&:presence).join(' - ') end - CFONB::OperationDetail.register('REF', self) + CFONB::OperationDetails.register('REF', self) end end end diff --git a/spec/cfonb/line_parser/operation_detail_spec.rb b/spec/cfonb/line_parser/operation_details_spec.rb similarity index 94% rename from spec/cfonb/line_parser/operation_detail_spec.rb rename to spec/cfonb/line_parser/operation_details_spec.rb index fb5b520..9011b15 100644 --- a/spec/cfonb/line_parser/operation_detail_spec.rb +++ b/spec/cfonb/line_parser/operation_details_spec.rb @@ -2,7 +2,7 @@ require 'cfonb' -describe CFONB::LineParser::OperationDetail do +describe CFONB::LineParser::OperationDetails do describe '.initialize' do subject(:line) { described_class.new(input) }