From f7c4f582a0592a7ced7407c77ffd0fd49071e6e0 Mon Sep 17 00:00:00 2001 From: Matej Hamas Date: Tue, 17 Aug 2021 15:35:56 +0200 Subject: [PATCH 1/6] feat(qr_codes): add function to generate czk payment qr codes --- packages/payment_qr_codes/CHANGELOG.md | 9 ++++ packages/payment_qr_codes/package.json | 42 +++++++++++++++++++ .../src/czk_payment_qr_codes.ts | 26 ++++++++++++ packages/payment_qr_codes/src/index.ts | 1 + packages/payment_qr_codes/tsconfig.build.json | 7 ++++ packages/payment_qr_codes/tsconfig.json | 4 ++ test/czk_payment_qr_codes.test.ts | 33 +++++++++++++++ 7 files changed, 122 insertions(+) create mode 100644 packages/payment_qr_codes/CHANGELOG.md create mode 100644 packages/payment_qr_codes/package.json create mode 100644 packages/payment_qr_codes/src/czk_payment_qr_codes.ts create mode 100644 packages/payment_qr_codes/src/index.ts create mode 100644 packages/payment_qr_codes/tsconfig.build.json create mode 100644 packages/payment_qr_codes/tsconfig.json create mode 100644 test/czk_payment_qr_codes.test.ts diff --git a/packages/payment_qr_codes/CHANGELOG.md b/packages/payment_qr_codes/CHANGELOG.md new file mode 100644 index 000000000..82c3c720a --- /dev/null +++ b/packages/payment_qr_codes/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## [0.0.1] + +### Features +* todo diff --git a/packages/payment_qr_codes/package.json b/packages/payment_qr_codes/package.json new file mode 100644 index 000000000..de702f392 --- /dev/null +++ b/packages/payment_qr_codes/package.json @@ -0,0 +1,42 @@ +{ + "name": "@apify/payment_qr_codes", + "version": "1.1.3", + "description": "Tools for creating payment QR codes.", + "main": "dist/index.js", + "typings": "dist/index.d.ts", + "keywords": [ + "apify" + ], + "author": { + "name": "Apify", + "email": "support@apify.com", + "url": "https://apify.com" + }, + "contributors": [ + "Matej Hamas " + ], + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/apify/apify-shared-js" + }, + "bugs": { + "url": "https://github.com/apify/apify-shared-js/issues" + }, + "homepage": "https://apify.com", + "scripts": { + "build": "npm run clean && npm run compile && npm run copy", + "clean": "rimraf ./dist", + "compile": "tsc -p tsconfig.build.json", + "copy": "ts-node -T ../../scripts/copy.ts" + }, + "publishConfig": { + "access": "public" + }, + "dependencies": { + "qrcode": "^1.4.4" + }, + "devDependencies": { + "@types/qrcode": "^1.4.1" + } +} diff --git a/packages/payment_qr_codes/src/czk_payment_qr_codes.ts b/packages/payment_qr_codes/src/czk_payment_qr_codes.ts new file mode 100644 index 000000000..d834dd4bb --- /dev/null +++ b/packages/payment_qr_codes/src/czk_payment_qr_codes.ts @@ -0,0 +1,26 @@ +import qrcode from 'qrcode'; + +interface CzkQRCodeInputData { + iban: string; + amount: number; + currencyCode: string; // 3 letter currency code + message: string; // e.g. invoice number +} +/* + * This function encodes provided data into a single string complying with CZK QR code payment protocol. + * The protocol is issued by Czech Bank Association and can be found + * at https://cbaonline.cz/upload/1645-standard-qr-v1-2-cerven-2021.pdf + */ +export function encodeInputDateToRawQrCodeInputString(data: CzkQRCodeInputData): string { + const { iban, amount, currencyCode, message } = data; + return `SPD*1.0*ACC:${iban}*AM:${amount}*CC:${currencyCode.toUpperCase()}*MSG:${message}`; +} + +/** + * This function generates CZK QR code that can be used for domestic QR code payment. + * It returns the QR code encoded as data URL that can be directly viewed in browser or used in tag. + */ +export async function generateCzkPaymentQrCodeDataUrl(data: CzkQRCodeInputData): Promise { + const code = qrcode.create(encodeInputDateToRawQrCodeInputString(data), {}); + return qrcode.toDataURL(code.segments); +} diff --git a/packages/payment_qr_codes/src/index.ts b/packages/payment_qr_codes/src/index.ts new file mode 100644 index 000000000..0a0f22ac4 --- /dev/null +++ b/packages/payment_qr_codes/src/index.ts @@ -0,0 +1 @@ +export * from './czk_payment_qr_codes'; diff --git a/packages/payment_qr_codes/tsconfig.build.json b/packages/payment_qr_codes/tsconfig.build.json new file mode 100644 index 000000000..856db0f21 --- /dev/null +++ b/packages/payment_qr_codes/tsconfig.build.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + "outDir": "./dist" + }, + "include": ["src/**/*"] +} diff --git a/packages/payment_qr_codes/tsconfig.json b/packages/payment_qr_codes/tsconfig.json new file mode 100644 index 000000000..52d43eaaa --- /dev/null +++ b/packages/payment_qr_codes/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.json", + "include": ["src/**/*"] +} diff --git a/test/czk_payment_qr_codes.test.ts b/test/czk_payment_qr_codes.test.ts new file mode 100644 index 000000000..83ebb3a9c --- /dev/null +++ b/test/czk_payment_qr_codes.test.ts @@ -0,0 +1,33 @@ +import { + encodeInputDateToRawQrCodeInputString, + generateCzkPaymentQrCodeDataUrl, +} from '@apify/payment_qr_codes'; + +describe('CZK payment QR code generation', () => { + it('can encode payment data to QR cod estring', () => { + expect(encodeInputDateToRawQrCodeInputString({ + iban: 'CZ6508000000192000145399', // testing IBAN from https://www.cnb.cz/cs/platebni-styk/iban/iban-mezinarodni-format-cisla-uctu/ + amount: 123.45, + currencyCode: 'czk', + message: 'Test message', + })).toBe('SPD*1.0*ACC:CZ6508000000192000145399*AM:123.45*CC:CZK*MSG:Test message'); + + expect(encodeInputDateToRawQrCodeInputString({ + iban: 'CZ6508000000192000145399', // testing IBAN from https://www.cnb.cz/cs/platebni-styk/iban/iban-mezinarodni-format-cisla-uctu/ + amount: 123.45, + currencyCode: 'EUR', + message: 'Test message', + })).toBe('SPD*1.0*ACC:CZ6508000000192000145399*AM:123.45*CC:EUR*MSG:Test message'); + }); + + it('test', async () => { + const code = await generateCzkPaymentQrCodeDataUrl({ + iban: 'CZ6508000000192000145399', // testing IBAN from https://www.cnb.cz/cs/platebni-styk/iban/iban-mezinarodni-format-cisla-uctu/ + amount: 123.45, + currencyCode: 'czk', + message: 'Test message', + }); + // eslint-disable-next-line max-len + expect(code).toBe('data:image/png;base64,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'); + }); +}); From 87ea1c8c597d76be8bc687a073d75ce7b1ed26b6 Mon Sep 17 00:00:00 2001 From: Matej Hamas Date: Tue, 17 Aug 2021 16:00:59 +0200 Subject: [PATCH 2/6] docs: changelog and packge.json --- packages/payment_qr_codes/CHANGELOG.md | 2 +- packages/payment_qr_codes/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/payment_qr_codes/CHANGELOG.md b/packages/payment_qr_codes/CHANGELOG.md index 82c3c720a..d7428de1e 100644 --- a/packages/payment_qr_codes/CHANGELOG.md +++ b/packages/payment_qr_codes/CHANGELOG.md @@ -6,4 +6,4 @@ See [Conventional Commits](https://conventionalcommits.org) for commit guideline ## [0.0.1] ### Features -* todo +* Add basic functionality for creating QR code for CZK domestic payments. diff --git a/packages/payment_qr_codes/package.json b/packages/payment_qr_codes/package.json index de702f392..f0acf2598 100644 --- a/packages/payment_qr_codes/package.json +++ b/packages/payment_qr_codes/package.json @@ -1,6 +1,6 @@ { "name": "@apify/payment_qr_codes", - "version": "1.1.3", + "version": "0.0.1", "description": "Tools for creating payment QR codes.", "main": "dist/index.js", "typings": "dist/index.d.ts", From 1daed93876eeb587c56bae32cc6b965ce2710918 Mon Sep 17 00:00:00 2001 From: Matej Hamas Date: Wed, 18 Aug 2021 07:33:58 +0200 Subject: [PATCH 3/6] feat: change test to snapshot --- test/__snapshots__/czk_payment_qr_codes.test.ts.snap | 3 +++ test/czk_payment_qr_codes.test.ts | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 test/__snapshots__/czk_payment_qr_codes.test.ts.snap diff --git a/test/__snapshots__/czk_payment_qr_codes.test.ts.snap b/test/__snapshots__/czk_payment_qr_codes.test.ts.snap new file mode 100644 index 000000000..4a2a2bc9b --- /dev/null +++ b/test/__snapshots__/czk_payment_qr_codes.test.ts.snap @@ -0,0 +1,3 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`CZK payment QR code generation test 1`] = `"data:image/png;base64,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"`; diff --git a/test/czk_payment_qr_codes.test.ts b/test/czk_payment_qr_codes.test.ts index 83ebb3a9c..0c8e0220a 100644 --- a/test/czk_payment_qr_codes.test.ts +++ b/test/czk_payment_qr_codes.test.ts @@ -27,7 +27,6 @@ describe('CZK payment QR code generation', () => { currencyCode: 'czk', message: 'Test message', }); - // eslint-disable-next-line max-len - expect(code).toBe('data:image/png;base64,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'); + expect(code).toMatchSnapshot(); }); }); From 3f1ee3a24a3a32813e3cd9a2d5f8234c9ebd52b2 Mon Sep 17 00:00:00 2001 From: Matej Hamas Date: Wed, 18 Aug 2021 07:34:55 +0200 Subject: [PATCH 4/6] feat: remove manualy changelog --- packages/payment_qr_codes/CHANGELOG.md | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 packages/payment_qr_codes/CHANGELOG.md diff --git a/packages/payment_qr_codes/CHANGELOG.md b/packages/payment_qr_codes/CHANGELOG.md deleted file mode 100644 index d7428de1e..000000000 --- a/packages/payment_qr_codes/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [0.0.1] - -### Features -* Add basic functionality for creating QR code for CZK domestic payments. From db737d22f06dc14ada95f67fde6c2ece6524d6cf Mon Sep 17 00:00:00 2001 From: Matej Hamas Date: Wed, 18 Aug 2021 10:50:36 +0200 Subject: [PATCH 5/6] feat: add recipient name --- packages/payment_qr_codes/src/czk_payment_qr_codes.ts | 5 +++-- test/__snapshots__/czk_payment_qr_codes.test.ts.snap | 2 +- test/czk_payment_qr_codes.test.ts | 7 +++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/payment_qr_codes/src/czk_payment_qr_codes.ts b/packages/payment_qr_codes/src/czk_payment_qr_codes.ts index d834dd4bb..5ca3d23d3 100644 --- a/packages/payment_qr_codes/src/czk_payment_qr_codes.ts +++ b/packages/payment_qr_codes/src/czk_payment_qr_codes.ts @@ -5,6 +5,7 @@ interface CzkQRCodeInputData { amount: number; currencyCode: string; // 3 letter currency code message: string; // e.g. invoice number + beneficiaryName: string; } /* * This function encodes provided data into a single string complying with CZK QR code payment protocol. @@ -12,8 +13,8 @@ interface CzkQRCodeInputData { * at https://cbaonline.cz/upload/1645-standard-qr-v1-2-cerven-2021.pdf */ export function encodeInputDateToRawQrCodeInputString(data: CzkQRCodeInputData): string { - const { iban, amount, currencyCode, message } = data; - return `SPD*1.0*ACC:${iban}*AM:${amount}*CC:${currencyCode.toUpperCase()}*MSG:${message}`; + const { iban, amount, currencyCode, message, beneficiaryName } = data; + return `SPD*1.0*RN:${beneficiaryName}*ACC:${iban}*AM:${amount}*CC:${currencyCode.toUpperCase()}*MSG:${message}`; } /** diff --git a/test/__snapshots__/czk_payment_qr_codes.test.ts.snap b/test/__snapshots__/czk_payment_qr_codes.test.ts.snap index 4a2a2bc9b..1587f7720 100644 --- a/test/__snapshots__/czk_payment_qr_codes.test.ts.snap +++ b/test/__snapshots__/czk_payment_qr_codes.test.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`CZK payment QR code generation test 1`] = `"data:image/png;base64,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"`; +exports[`CZK payment QR code generation test 1`] = `"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALQAAAC0CAYAAAA9zQYyAAAAAklEQVR4AewaftIAAAeJSURBVO3BQW4ky5LAQDKg+1+Z00tfJZCokub9gJvZP6x1icNaFzmsdZHDWhc5rHWRw1oXOax1kcNaFzmsdZHDWhc5rHWRw1oXOax1kcNaFzmsdZHDWhf54UMqf6niicpUMalMFZPKJyomlaniicpU8UTlmyomlb9U8YnDWhc5rHWRw1oX+eHLKr5J5YnKE5VPVEwqv6niicqTikllqphU3qj4JpVvOqx1kcNaFzmsdZEffpnKGxVvVEwqU8WkMqk8UZkq3qiYVKaKNyomlUnljYpPqLxR8ZsOa13ksNZFDmtd5IfLqUwVk8pfqphUPlExqbyhMlX8LzusdZHDWhc5rHWRH/7HqTypmFSmik+oTBWTyicqnqh8ouImh7UucljrIoe1LvLDL6v4TRVvVEwqb1RMFZPKVDGpTBVPVJ5UTCp/qeK/5LDWRQ5rXeSw1kV++DKVv6QyVUwqU8WTiknlicpUMalMFZPKVPGkYlKZKiaVJypTxROV/7LDWhc5rHWRw1oXsX+4iMqTiknlScUbKp+o+E0qU8VNDmtd5LDWRQ5rXcT+4QMqU8WkMlVMKlPFpDJVfELlScWk8kbFpDJVfJPKN1W8oTJVPFGZKr7psNZFDmtd5LDWRewf/pDKk4pPqDypeEPlN1VMKlPFpPKk4onKVPFE5UnFpDJVTCpPKj5xWOsih7UucljrIvYPH1CZKiaVqeINlaniDZUnFZPKJyq+SeWbKiaVqeI3qUwV33RY6yKHtS5yWOsi9g8fUPlExV9SeaPiicqTikllqphUnlRMKk8qJpU3Kp6oTBVPVKaKbzqsdZHDWhc5rHUR+4cPqEwVk8pUMalMFZPKGxWTylQxqXyi4onKVPEJlScVb6hMFZPKVPGGyhsVnzisdZHDWhc5rHWRHz5UMam8UfGkYlJ5ojJV/JepvFExqbyhMlVMKlPFE5UnFX/psNZFDmtd5LDWRX74soonKk8qJpWpYlKZKiaVNyo+oTJVvFExqbyhMlU8UZkqnqg8qZhUnlR802GtixzWushhrYvYP/yHqEwVk8pU8YbKJyo+oTJVTCrfVDGpTBWTyjdV/KXDWhc5rHWRw1oXsX/4IpUnFU9UnlRMKlPFE5UnFZPKk4pPqEwVk8pUMak8qXiiMlU8UZkqJpUnFb/psNZFDmtd5LDWRX74YypvVLyh8qTiN6lMFZPKJ1SmiknlicpUMalMFVPFGxV/6bDWRQ5rXeSw1kV++LKKSeVJxaQyqbxRMam8ofKk4v9TxaQyVUwqT1TeUHlS8UTlScUnDmtd5LDWRQ5rXcT+4QMqU8WkMlVMKk8q3lCZKp6oPKmYVKaKJypTxaTyiYpJZap4ovKbKiaVqeKbDmtd5LDWRQ5rXeSHD1VMKlPFpPKGylTxCZU3VKaKSWWqmComlScVk8pUMam8ofJGxaQyVUwqTyomlaniE4e1LnJY6yKHtS7yw5dVTCpPKn6TylTxCZWpYlJ5o+JJxaTypGJSeaPiScWkMlX8fzqsdZHDWhc5rHUR+4f/EJUnFb9J5Y2KJypTxROVqeKJypOKJypTxaQyVTxReVLxmw5rXeSw1kUOa13khw+pPKmYVKaKqeKJylTxhspU8UbFpPKGylQxVfwmlTcq3qiYVJ6oTBWfOKx1kcNaFzmsdZEfPlQxqUwqU8WkMlVMKn+pYlJ5o2JS+SaV36TypOK/7LDWRQ5rXeSw1kV++LKKNyqeVEwqT1SeVEwqb6j8JpWpYqr4RMWk8gmVqeKNim86rHWRw1oXOax1kR8+pDJVTCpTxaQyVUwqU8Wk8obKVDGpfFPFGxWTyhsV31QxqUwVk8pUMak8qfjEYa2LHNa6yGGti/zwoYpJZaqYVKaKJxWTyhsVT1SeVDxReUNlqphUpopJ5Q2VqeINlaliUpkq/j8d1rrIYa2LHNa6iP3DB1SmiicqTyomlaniDZWp4onKGxWTypOKN1SeVLyh8pcqJpUnFZ84rHWRw1oXOax1EfuH/2EqU8UbKlPFpPKk4onKk4pJZar4TSpTxRsqTyqeqEwVnzisdZHDWhc5rHWRHz6k8pcqpopJ5UnFE5UnFZPKk4pJ5UnFpDJVTCpTxTepTBVvqPylw1oXOax1kcNaF/nhyyq+SeUTFZPKGxWTylTxTSpvVEwqU8UnKj5R8ZcOa13ksNZFDmtd5IdfpvJGxRsqU8U3qfwmlaliUplU3lB5Q+UvqUwVnzisdZHDWhc5rHWRH/7HVUwq31QxqTxRmSreUHlSMalMFU9UpoonKlPFJ1Smim86rHWRw1oXOax1kR/+x6lMFZPKVPFEZVKZKp5UTCpvVEwqk8oTlScVk8obKlPFpPKkYlKZKj5xWOsih7UucljrIj/8sorfVPEJlaniicpUMalMFU9UJpWpYlJ5UvFE5UnFpPJGxROV33RY6yKHtS5yWOsiP3yZyl9SeVLxhspUMVVMKk9U3qiYVD6hMlX8f6qYVL7psNZFDmtd5LDWRewf1rrEYa2LHNa6yGGtixzWushhrYsc1rrIYa2LHNa6yGGtixzWushhrYsc1rrIYa2LHNa6yGGti/wfUZ3njolYwk8AAAAASUVORK5CYII="`; diff --git a/test/czk_payment_qr_codes.test.ts b/test/czk_payment_qr_codes.test.ts index 0c8e0220a..5ab5d0560 100644 --- a/test/czk_payment_qr_codes.test.ts +++ b/test/czk_payment_qr_codes.test.ts @@ -10,14 +10,16 @@ describe('CZK payment QR code generation', () => { amount: 123.45, currencyCode: 'czk', message: 'Test message', - })).toBe('SPD*1.0*ACC:CZ6508000000192000145399*AM:123.45*CC:CZK*MSG:Test message'); + beneficiaryName: 'John Doe', + })).toBe('SPD*1.0*RN:John Doe*ACC:CZ6508000000192000145399*AM:123.45*CC:CZK*MSG:Test message'); expect(encodeInputDateToRawQrCodeInputString({ iban: 'CZ6508000000192000145399', // testing IBAN from https://www.cnb.cz/cs/platebni-styk/iban/iban-mezinarodni-format-cisla-uctu/ amount: 123.45, currencyCode: 'EUR', message: 'Test message', - })).toBe('SPD*1.0*ACC:CZ6508000000192000145399*AM:123.45*CC:EUR*MSG:Test message'); + beneficiaryName: 'John Doe', + })).toBe('SPD*1.0*RN:John Doe*ACC:CZ6508000000192000145399*AM:123.45*CC:EUR*MSG:Test message'); }); it('test', async () => { @@ -26,6 +28,7 @@ describe('CZK payment QR code generation', () => { amount: 123.45, currencyCode: 'czk', message: 'Test message', + beneficiaryName: 'John Doe', }); expect(code).toMatchSnapshot(); }); From 3be59782e08f5f22c7ac5b0408de8fc1b2760535 Mon Sep 17 00:00:00 2001 From: Matej Hamas Date: Wed, 18 Aug 2021 11:23:33 +0200 Subject: [PATCH 6/6] feat: fix typo --- packages/payment_qr_codes/src/czk_payment_qr_codes.ts | 4 ++-- test/czk_payment_qr_codes.test.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/payment_qr_codes/src/czk_payment_qr_codes.ts b/packages/payment_qr_codes/src/czk_payment_qr_codes.ts index 5ca3d23d3..3270d57cc 100644 --- a/packages/payment_qr_codes/src/czk_payment_qr_codes.ts +++ b/packages/payment_qr_codes/src/czk_payment_qr_codes.ts @@ -12,7 +12,7 @@ interface CzkQRCodeInputData { * The protocol is issued by Czech Bank Association and can be found * at https://cbaonline.cz/upload/1645-standard-qr-v1-2-cerven-2021.pdf */ -export function encodeInputDateToRawQrCodeInputString(data: CzkQRCodeInputData): string { +export function encodeInputDataToRawQrCodeInputString(data: CzkQRCodeInputData): string { const { iban, amount, currencyCode, message, beneficiaryName } = data; return `SPD*1.0*RN:${beneficiaryName}*ACC:${iban}*AM:${amount}*CC:${currencyCode.toUpperCase()}*MSG:${message}`; } @@ -22,6 +22,6 @@ export function encodeInputDateToRawQrCodeInputString(data: CzkQRCodeInputData): * It returns the QR code encoded as data URL that can be directly viewed in browser or used in tag. */ export async function generateCzkPaymentQrCodeDataUrl(data: CzkQRCodeInputData): Promise { - const code = qrcode.create(encodeInputDateToRawQrCodeInputString(data), {}); + const code = qrcode.create(encodeInputDataToRawQrCodeInputString(data), {}); return qrcode.toDataURL(code.segments); } diff --git a/test/czk_payment_qr_codes.test.ts b/test/czk_payment_qr_codes.test.ts index 5ab5d0560..f49131dbd 100644 --- a/test/czk_payment_qr_codes.test.ts +++ b/test/czk_payment_qr_codes.test.ts @@ -1,11 +1,11 @@ import { - encodeInputDateToRawQrCodeInputString, + encodeInputDataToRawQrCodeInputString, generateCzkPaymentQrCodeDataUrl, } from '@apify/payment_qr_codes'; describe('CZK payment QR code generation', () => { it('can encode payment data to QR cod estring', () => { - expect(encodeInputDateToRawQrCodeInputString({ + expect(encodeInputDataToRawQrCodeInputString({ iban: 'CZ6508000000192000145399', // testing IBAN from https://www.cnb.cz/cs/platebni-styk/iban/iban-mezinarodni-format-cisla-uctu/ amount: 123.45, currencyCode: 'czk', @@ -13,7 +13,7 @@ describe('CZK payment QR code generation', () => { beneficiaryName: 'John Doe', })).toBe('SPD*1.0*RN:John Doe*ACC:CZ6508000000192000145399*AM:123.45*CC:CZK*MSG:Test message'); - expect(encodeInputDateToRawQrCodeInputString({ + expect(encodeInputDataToRawQrCodeInputString({ iban: 'CZ6508000000192000145399', // testing IBAN from https://www.cnb.cz/cs/platebni-styk/iban/iban-mezinarodni-format-cisla-uctu/ amount: 123.45, currencyCode: 'EUR',