diff --git a/src/app-gocardless/banks/swedbank-habalv22.js b/src/app-gocardless/banks/swedbank-habalv22.js index 49ae1e9b3..3732f2417 100644 --- a/src/app-gocardless/banks/swedbank-habalv22.js +++ b/src/app-gocardless/banks/swedbank-habalv22.js @@ -14,17 +14,36 @@ export default { * The actual transaction date for card transactions is only available in the remittanceInformationUnstructured field when the transaction is booked. */ normalizeTransaction(transaction, booked) { - const dateMatch = transaction.remittanceInformationUnstructured?.match( - /PIRKUMS [\d*]+ (\d{2}\.\d{2}\.\d{4})/, - ); - - if (dateMatch) { - const extractedDate = d.parse(dateMatch[1], 'dd.MM.yyyy', new Date()); - - return Fallback.normalizeTransaction( - { ...transaction, bookingDate: d.format(extractedDate, 'yyyy-MM-dd') }, - booked, + const isCardTransaction = + transaction.remittanceInformationUnstructured?.startsWith('PIRKUMS'); + + if (isCardTransaction) { + if (!booked && !transaction.creditorName) { + const creditorNameMatch = + transaction.remittanceInformationUnstructured?.match( + /PIRKUMS [\d*]+ \d{2}\.\d{2}\.\d{2} \d{2}:\d{2} [\d.]+ \w{3} \(\d+\) (.+)/, + ); + + if (creditorNameMatch) { + transaction = { + ...transaction, + creditorName: creditorNameMatch[1], + }; + } + } + + const dateMatch = transaction.remittanceInformationUnstructured?.match( + /PIRKUMS [\d*]+ (\d{2}\.\d{2}\.\d{4})/, ); + + if (dateMatch) { + const extractedDate = d.parse(dateMatch[1], 'dd.MM.yyyy', new Date()); + + transaction = { + ...transaction, + bookingDate: d.format(extractedDate, 'yyyy-MM-dd'), + }; + } } return Fallback.normalizeTransaction(transaction, booked); diff --git a/src/app-gocardless/banks/tests/swedbank-habalv22.spec.js b/src/app-gocardless/banks/tests/swedbank-habalv22.spec.js index 02a163238..9af4af9f4 100644 --- a/src/app-gocardless/banks/tests/swedbank-habalv22.spec.js +++ b/src/app-gocardless/banks/tests/swedbank-habalv22.spec.js @@ -1,7 +1,7 @@ import SwedbankHabaLV22 from '../swedbank-habalv22.js'; describe('#normalizeTransaction', () => { - const cardTransaction = { + const bookedCardTransaction = { transactionId: '2024102900000000-1', bookingDate: '2024-10-29', valueDate: '2024-10-29', @@ -15,14 +15,15 @@ describe('#normalizeTransaction', () => { bankTransactionCode: 'PMNT-CCRD-POSD', internalTransactionId: 'fa000f86afb2cc7678bcff0000000000', }; - + it('extracts card transaction date', () => { expect( - SwedbankHabaLV22.normalizeTransaction(cardTransaction, true).bookingDate, + SwedbankHabaLV22.normalizeTransaction(bookedCardTransaction, true) + .bookingDate, ).toEqual('2024-10-28'); expect( - SwedbankHabaLV22.normalizeTransaction(cardTransaction, true).date, + SwedbankHabaLV22.normalizeTransaction(bookedCardTransaction, true).date, ).toEqual('2024-10-28'); }); @@ -32,7 +33,7 @@ describe('#normalizeTransaction', () => { ['null value', null], ])('normalizes non-card transaction with %s', (_, remittanceInfo) => { const transaction = { - ...cardTransaction, + ...bookedCardTransaction, remittanceInformationUnstructured: remittanceInfo, }; const normalized = SwedbankHabaLV22.normalizeTransaction(transaction, true); @@ -40,4 +41,22 @@ describe('#normalizeTransaction', () => { expect(normalized.bookingDate).toEqual('2024-10-29'); expect(normalized.date).toEqual('2024-10-29'); }); + + const pendingCardTransaction = { + transactionId: '2024102900000000-1', + valueDate: '2024-10-29', + transactionAmount: { + amount: '-22.99', + currency: 'EUR', + }, + remittanceInformationUnstructured: + 'PIRKUMS 424242******4242 28.10.24 13:37 22.99 EUR (111111) SOME CREDITOR NAME', + }; + + it('extracts pending card transaction creditor name', () => { + expect( + SwedbankHabaLV22.normalizeTransaction(pendingCardTransaction, false) + .creditorName, + ).toEqual('SOME CREDITOR NAME'); + }); });