From f205e5beecb158b6e2cb7f638fcc2be14fc7aeb8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Cardon?= <s.cardon@outlook.com>
Date: Tue, 3 Dec 2024 15:41:23 +0100
Subject: [PATCH] fix: allow optional bic for Sepa Credit Transfert on creditor
 agent (#289)

* fix: allow optional bic for Sepa Credit Transfert on creditor agent

* fix: remove pnpm-lock and add more precision on test name
---
 src/index.test.ts | 39 +++++++++++++++++++++++++++++++++++++++
 src/index.ts      |  4 +++-
 2 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/src/index.test.ts b/src/index.test.ts
index cd2c74e..56c3328 100644
--- a/src/index.test.ts
+++ b/src/index.test.ts
@@ -353,3 +353,42 @@ test("issue #287", () => {
     ),
   ).toThrow("sepaData.positions[0].bic is not valid (Test)");
 });
+
+test("BIC is not necessary for SEPA Credit Transfer and SEPA Direct Debit on creditor", () => {
+  expect(
+    createSepaXML(
+      {
+        painVersion: "pain.001.001.03",
+        id: "Test1345",
+        creationDate: dayjs.utc("2022-06-16").toDate(),
+        initiatorName: "Test Company",
+        positions: [
+          {
+            id: "Test123",
+            batchBooking: false,
+            iban: "DE02701500000000594937",
+            requestedExecutionDate: dayjs.utc("2022-06-16").toDate(),
+            name: "Pos 1",
+            payments: [
+              {
+                id: "123",
+                amount: 230,
+                currency: "EUR",
+                name: "Money Company",
+                iban: "DE02701500000000594937",
+                remittanceInformation: "Money please",
+                end2endReference: "lol",
+              },
+            ],
+          },
+        ],
+      },
+      {
+        checkIBAN: true,
+        checkBIC: true,
+      },
+    ),
+  ).toBe(
+    `<?xml version="1.0" encoding="UTF-8"?><Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03 pain.001.001.03.xsd"><CstmrCdtTrfInitn><GrpHdr><MsgId>Test1345</MsgId><CreDtTm>2022-06-16T00:00:00</CreDtTm><NbOfTxs>1</NbOfTxs><CtrlSum>230.00</CtrlSum><InitgPty><Nm>Test Company</Nm></InitgPty></GrpHdr><PmtInf><PmtInfId>Test123</PmtInfId><PmtMtd>TRF</PmtMtd><BtchBookg>false</BtchBookg><NbOfTxs>1</NbOfTxs><CtrlSum>230.00</CtrlSum><PmtTpInf><SvcLvl><Cd>SEPA</Cd></SvcLvl></PmtTpInf><ReqdExctnDt>2022-06-16</ReqdExctnDt><Dbtr><Nm>Pos 1</Nm></Dbtr><DbtrAcct><Id><IBAN>DE02701500000000594937</IBAN></Id></DbtrAcct><DbtrAgt><FinInstnId><BIC/></FinInstnId></DbtrAgt><ChrgBr>SLEV</ChrgBr><CdtTrfTxInf><PmtId><InstrId>123</InstrId><EndToEndId>lol</EndToEndId></PmtId><Amt><InstdAmt Ccy="EUR">230.00</InstdAmt></Amt><CdtrAgt><FinInstnId/></CdtrAgt><Cdtr><Nm>Money Company</Nm></Cdtr><CdtrAcct><Id><IBAN>DE02701500000000594937</IBAN></Id></CdtrAcct><RmtInf><Ustrd>Money please</Ustrd></RmtInf></CdtTrfTxInf></PmtInf></CstmrCdtTrfInitn></Document>`,
+  );
+});
diff --git a/src/index.ts b/src/index.ts
index 97a6017..836db45 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -371,7 +371,9 @@ function getPayments(
         },
       };
 
-      const bicOptional = PAIN_TYPES[painFormat] === "CstmrDrctDbtInitn";
+      const bicOptional =
+        PAIN_TYPES[painFormat] === "CstmrDrctDbtInitn" ||
+        PAIN_TYPES[painFormat] === "CstmrCdtTrfInitn";
       paymentData.CdtrAgt = {
         FinInstnId: { BIC: payment.bic },
       };