diff --git a/app/models/bank_transaction.rb b/app/models/bank_transaction.rb index 69cf6fc2a8..a610b41f88 100644 --- a/app/models/bank_transaction.rb +++ b/app/models/bank_transaction.rb @@ -38,11 +38,7 @@ def autobind_invoice(manual: false) return unless invoice return unless invoice.payable? - channel = if manual - 'admin_payment' - else - 'system_payment' - end + channel = manual ? 'admin_payment' : 'system_payment' create_internal_payment_record(channel: channel, invoice: invoice, registrar: registrar) end @@ -121,7 +117,12 @@ def parsed_ref_number end def ref_number_from_description - match_data = /(\d{7})/.match(description) - match_data[0] if match_data.present? + (Billing::ReferenceNo::MULTI_REGEXP.match(description) || []).captures.each do |match| + break match if match.length == 7 || valid_ref_no?(match) + end + end + + def valid_ref_no?(match) + return true if Billing::ReferenceNo.valid?(match) && Registrar.find_by(reference_no: match).any? end end diff --git a/app/models/billing/reference_no.rb b/app/models/billing/reference_no.rb index 23812214c9..d164f7565d 100644 --- a/app/models/billing/reference_no.rb +++ b/app/models/billing/reference_no.rb @@ -1,10 +1,16 @@ module Billing class ReferenceNo - REGEXP = /\A\d{2,20}\z/ + REGEXP = /\A\d{2,20}\z/.freeze + MULTI_REGEXP = /(\d{2,20})/.freeze def self.generate base = Base.generate "#{base}#{base.check_digit}" end + + def self.valid?(ref) + base = Base.new(ref.to_s[0...-1]) + ref.to_s == "#{base}#{base.check_digit}" + end end end diff --git a/app/models/billing/reference_no/base.rb b/app/models/billing/reference_no/base.rb index dcc7718e7c..8614f81f8e 100644 --- a/app/models/billing/reference_no/base.rb +++ b/app/models/billing/reference_no/base.rb @@ -2,7 +2,7 @@ module Billing class ReferenceNo class Base def self.generate - new(SecureRandom.random_number(1..1_000_000)) + new((SecureRandom.random_number(9e5) + 1e5).to_i) end def initialize(base)