Skip to content

Commit 0678c8a

Browse files
authored
Merge pull request #192 from internetee/impvove-end-to-end-parsing
Fix parsing of reference numbers from end_to_end_id field with text prefixes
2 parents cb0ce78 + 4c81f9f commit 0678c8a

File tree

3 files changed

+154
-8
lines changed

3 files changed

+154
-8
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,5 @@ vendor/gems
5050
/public/assets/
5151

5252
.DS_Store
53+
.cursorindexingignore
54+
.specstory/

app/jobs/payment_lhv_connect_job.rb

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,15 @@ def parse_reference_number(credit_transaction)
7272
end
7373

7474
if credit_transaction.end_to_end_id.present?
75-
reference = credit_transaction.end_to_end_id
76-
Rails.logger.info "Checking end_to_end_id field for reference number: #{reference}"
77-
ref = Reference.find_by(reference_number: reference)
78-
if ref.present?
79-
Rails.logger.info "Found valid reference number in end_to_end_id field: #{reference}"
80-
return reference
75+
end_to_end_reference = extract_reference_from_text(credit_transaction.end_to_end_id)
76+
if end_to_end_reference
77+
Rails.logger.info "Checking end_to_end_id field for reference number: #{end_to_end_reference}"
78+
ref = Reference.find_by(reference_number: end_to_end_reference)
79+
if ref.present?
80+
Rails.logger.info "Found valid reference number in end_to_end_id field: #{end_to_end_reference}"
81+
return end_to_end_reference
82+
end
83+
reference = end_to_end_reference
8184
end
8285
end
8386

@@ -91,6 +94,13 @@ def ref_number_from_description(description)
9194
matches.detect { |m| break m if m.length == 7 || valid_ref_no?(m) }
9295
end
9396

97+
def extract_reference_from_text(text)
98+
return text if text.to_s.match?(Billing::ReferenceNo::REGEXP)
99+
100+
matches = text.to_s.scan(Billing::ReferenceNo::MULTI_REGEXP).flatten
101+
matches.detect { |m| break m if m.length == 7 || valid_ref_no?(m) }
102+
end
103+
94104
def valid_ref_no?(match)
95105
true if Billing::ReferenceNo.valid?(match)
96106
end

spec/jobs/payment_lhv_connect_job_spec.rb

Lines changed: 136 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,12 +331,146 @@
331331
end
332332

333333
expect_any_instance_of(BillingMailer).to receive(:inform_admin).with(
334-
reference_number: nil,
334+
reference_number: nil,
335335
body: an_instance_of(OpenStruct)
336336
).and_return(double("mailer", deliver_now: true))
337-
337+
338338
expect_any_instance_of(PaymentLhvConnectJob).not_to receive(:send_transactions)
339339
PaymentLhvConnectJob.perform_now
340340
end
341+
342+
it 'should parse reference number from end_to_end_id with text prefix like "Ref 1234567"' do
343+
ref = Billing::ReferenceNo.generate
344+
Reference.create(reference_number: ref, initiator: 'registry')
345+
346+
date = Time.zone.now - 4.hours
347+
end_to_end_with_text = "Ref #{ref}"
348+
349+
params_for_sending = OpenStruct.new(
350+
amount: '10.0',
351+
currency: 'EUR',
352+
date: date,
353+
payment_reference_number: ref,
354+
payment_description: 'Money transfer',
355+
end_to_end_id: end_to_end_with_text
356+
)
357+
358+
Lhv::ConnectApi.class_eval do
359+
define_method :credit_debit_notification_messages do
360+
transaction = OpenStruct.new(
361+
amount: '10.0',
362+
currency: 'EUR',
363+
date: date,
364+
payment_reference_number: nil,
365+
payment_description: 'Money transfer',
366+
end_to_end_id: end_to_end_with_text
367+
)
368+
message = OpenStruct.new(
369+
bank_account_iban: Setting.registry_bank_account_iban_lhv || 'EE177700771001155322',
370+
credit_transactions: [transaction]
371+
)
372+
[message]
373+
end
374+
end
375+
376+
expect_any_instance_of(PaymentLhvConnectJob).to receive(:send_transactions).with(
377+
params: [params_for_sending],
378+
payment_reference_number: ref
379+
)
380+
PaymentLhvConnectJob.perform_now
381+
end
382+
383+
it 'should parse reference number from end_to_end_id with various text formats' do
384+
ref = Billing::ReferenceNo.generate
385+
Reference.create(reference_number: ref, initiator: 'registry')
386+
387+
date = Time.zone.now - 4.hours
388+
end_to_end_with_text = "Reference: #{ref} payment"
389+
390+
params_for_sending = OpenStruct.new(
391+
amount: '10.0',
392+
currency: 'EUR',
393+
date: date,
394+
payment_reference_number: ref,
395+
payment_description: 'Money transfer',
396+
end_to_end_id: end_to_end_with_text
397+
)
398+
399+
Lhv::ConnectApi.class_eval do
400+
define_method :credit_debit_notification_messages do
401+
transaction = OpenStruct.new(
402+
amount: '10.0',
403+
currency: 'EUR',
404+
date: date,
405+
payment_reference_number: nil,
406+
payment_description: 'Money transfer',
407+
end_to_end_id: end_to_end_with_text
408+
)
409+
message = OpenStruct.new(
410+
bank_account_iban: Setting.registry_bank_account_iban_lhv || 'EE177700771001155322',
411+
credit_transactions: [transaction]
412+
)
413+
[message]
414+
end
415+
end
416+
417+
expect_any_instance_of(PaymentLhvConnectJob).to receive(:send_transactions).with(
418+
params: [params_for_sending],
419+
payment_reference_number: ref
420+
)
421+
PaymentLhvConnectJob.perform_now
422+
end
423+
end
424+
425+
describe '#extract_reference_from_text' do
426+
let(:job) { PaymentLhvConnectJob.new }
427+
428+
before do
429+
allow(Billing::ReferenceNo).to receive(:valid?).and_call_original
430+
end
431+
432+
it 'returns text as-is when it is already a pure reference number' do
433+
ref = Billing::ReferenceNo.generate
434+
result = job.send(:extract_reference_from_text, ref)
435+
expect(result).to eq(ref)
436+
end
437+
438+
it 'extracts reference number from "Ref 1234567" format' do
439+
ref = Billing::ReferenceNo.generate
440+
result = job.send(:extract_reference_from_text, "Ref #{ref}")
441+
expect(result).to eq(ref)
442+
end
443+
444+
it 'extracts reference number from text with prefix and suffix' do
445+
ref = Billing::ReferenceNo.generate
446+
result = job.send(:extract_reference_from_text, "Reference: #{ref} payment")
447+
expect(result).to eq(ref)
448+
end
449+
450+
it 'returns nil for text without any numbers' do
451+
result = job.send(:extract_reference_from_text, 'No numbers here')
452+
expect(result).to be_nil
453+
end
454+
455+
it 'returns nil for empty string' do
456+
result = job.send(:extract_reference_from_text, '')
457+
expect(result).to be_nil
458+
end
459+
460+
it 'returns nil for nil input' do
461+
result = job.send(:extract_reference_from_text, nil)
462+
expect(result).to be_nil
463+
end
464+
465+
it 'extracts 7-digit reference number from text' do
466+
result = job.send(:extract_reference_from_text, 'Ref 1234567')
467+
expect(result).to eq('1234567')
468+
end
469+
470+
it 'finds valid reference number among multiple numbers in text' do
471+
ref = Billing::ReferenceNo.generate
472+
result = job.send(:extract_reference_from_text, "Invoice 99 ref #{ref} amount 100")
473+
expect(result).to eq(ref)
474+
end
341475
end
342476
end

0 commit comments

Comments
 (0)