diff --git a/src/__mocks__/base.ts b/src/__mocks__/base.ts index b49ce9f12..70982397c 100644 --- a/src/__mocks__/base.ts +++ b/src/__mocks__/base.ts @@ -112,7 +112,8 @@ const getReversalRequest = (poiTransaction: TransactionIdentification): Reversal TimeStamp: poiTransaction.TimeStamp }, }, - ReversalReason: ReversalReasonType.MerchantCancel + ReversalReason: ReversalReasonType.MerchantCancel, + SaleData: saleData }); const getSaleToPOIRequest = (messageHeader: MessageHeader, request: Partial): SaleToPOIRequest => ({ diff --git a/src/__tests__/terminalCloudAPI.spec.ts b/src/__tests__/terminalCloudAPI.spec.ts index ce2d68e6c..378893b49 100644 --- a/src/__tests__/terminalCloudAPI.spec.ts +++ b/src/__tests__/terminalCloudAPI.spec.ts @@ -46,7 +46,7 @@ afterEach((): void => { const isCI = process.env.CI === "true" || (typeof process.env.CI === "boolean" && process.env.CI); describe("Terminal Cloud API", (): void => { - test.each([isCI, true])("should make an async payment request, isMock: %p", async (isMock): Promise => { + test.each([isCI])("should make an async payment request, isMock: %p", async (isMock): Promise => { !isMock && nock.restore(); scope.post("/async").reply(200, asyncRes); @@ -57,7 +57,7 @@ describe("Terminal Cloud API", (): void => { expect(requestResponse).toEqual("ok"); }); - test.each([isCI, true])("should make a sync payment request, isMock: %p", async (isMock): Promise => { + test.each([isCI])("should make a sync payment request, isMock: %p", async (isMock): Promise => { !isMock && nock.restore(); scope.post("/sync").reply(200, syncRes); @@ -68,7 +68,7 @@ describe("Terminal Cloud API", (): void => { expect(terminalAPIResponse.SaleToPOIResponse?.MessageHeader).toBeDefined(); }); - test.each([isCI, true])("should return event notification if response contains it, isMock: %p", async (isMock): Promise => { + test.each([isCI])("should return event notification if response contains it, isMock: %p", async (isMock): Promise => { !isMock && nock.restore(); const terminalAPIPaymentRequest = createTerminalAPIPaymentRequest(); @@ -79,23 +79,24 @@ describe("Terminal Cloud API", (): void => { expect(terminalAPIResponse.SaleToPOIRequest?.EventNotification).toBeDefined(); }); - test.each([isCI, true])("should make an async refund request, isMock: %p", async (isMock): Promise => { + test.each([isCI])("should make an async refund request, isMock: %p", async (isMock): Promise => { !isMock && nock.restore(); scope.post("/sync").reply(200, syncRes); const terminalAPIPaymentRequest = createTerminalAPIPaymentRequest(); const terminalAPIResponse: TerminalApiResponse = await terminalCloudAPI.sync(terminalAPIPaymentRequest); + const pOITransactionId = terminalAPIResponse.SaleToPOIResponse!.PaymentResponse!.POIData!.POITransactionID; + expect(pOITransactionId).toBeTruthy(); + scope.post("/sync").reply(200, syncRefund); - const pOITransactionId = terminalAPIResponse.SaleToPOIResponse?.PaymentResponse?.POIData!.POITransactionID; - if(pOITransactionId) { - const terminalAPIRefundRequest = createTerminalAPIRefundRequest(pOITransactionId); - const terminalAPIRefundResponse = await terminalCloudAPI.sync(terminalAPIRefundRequest); + const terminalAPIRefundRequest = createTerminalAPIRefundRequest(pOITransactionId); + const id = Math.floor(Math.random() * Math.floor(10000000)).toString(); + terminalAPIRefundRequest.SaleToPOIRequest.MessageHeader.ServiceID = id; + terminalAPIRefundRequest.SaleToPOIRequest.ReversalRequest!.SaleData!.SaleToAcquirerData!.currency = 'EUR'; + const terminalAPIRefundResponse = await terminalCloudAPI.sync(terminalAPIRefundRequest); - expect(terminalAPIRefundResponse.SaleToPOIResponse?.ReversalResponse).toBeDefined(); - } else { - fail(); - } - }); + expect(terminalAPIRefundResponse.SaleToPOIResponse?.ReversalResponse?.Response.Result).toBe('Success'); + }, 20000); }); diff --git a/src/services/terminalCloudAPI.ts b/src/services/terminalCloudAPI.ts index 3adda40a0..13c17362f 100644 --- a/src/services/terminalCloudAPI.ts +++ b/src/services/terminalCloudAPI.ts @@ -46,14 +46,6 @@ class TerminalCloudAPI extends ApiKeyAuthenticatedService { const reqWithAppInfo = {saleToPOIRequest}; mergeDeep(request, reqWithAppInfo); - const formattedRequest = ObjectSerializer.serialize(request, "TerminalApiRequest"); - - if (formattedRequest.SaleToPOIRequest?.PaymentRequest?.SaleData?.SaleToAcquirerData) { - const dataString = JSON.stringify(formattedRequest.SaleToPOIRequest.PaymentRequest.SaleData.SaleToAcquirerData); - formattedRequest.SaleToPOIRequest.PaymentRequest.SaleData.SaleToAcquirerData = Buffer.from(dataString).toString("base64"); - } - - return formattedRequest; } return ObjectSerializer.serialize(request, "TerminalApiRequest"); diff --git a/src/services/terminalLocalAPI.ts b/src/services/terminalLocalAPI.ts index e92e8c9fb..3d2a86ea6 100644 --- a/src/services/terminalLocalAPI.ts +++ b/src/services/terminalLocalAPI.ts @@ -47,12 +47,6 @@ class TerminalLocalAPI extends ApiKeyAuthenticatedService { securityKey: SecurityKey, ): Promise { const formattedRequest = ObjectSerializer.serialize(terminalApiRequest, "TerminalApiRequest"); - - if (formattedRequest.SaleToPOIRequest?.PaymentRequest?.SaleData?.SaleToAcquirerData) { - const dataString = JSON.stringify(formattedRequest.SaleToPOIRequest.PaymentRequest.SaleData.SaleToAcquirerData); - formattedRequest.SaleToPOIRequest.PaymentRequest.SaleData.SaleToAcquirerData = Buffer.from(dataString).toString("base64"); - } - const saleToPoiSecuredMessage: SaleToPOISecuredMessage = NexoCrypto.encrypt( terminalApiRequest.SaleToPOIRequest.MessageHeader, JSON.stringify(formattedRequest), diff --git a/src/typings/terminal/models.ts b/src/typings/terminal/models.ts index 19ae47323..2a8c2baec 100644 --- a/src/typings/terminal/models.ts +++ b/src/typings/terminal/models.ts @@ -853,6 +853,9 @@ export class ObjectSerializer { return transformedData; } else if (type === "Date") { return data.toISOString(); + } else if (type === "SaleToAcquirerData") { + const dataString = JSON.stringify(data); + return Buffer.from(dataString).toString("base64"); } else { if (enumsMap[type]) { return data; diff --git a/src/typings/terminal/reversalRequest.ts b/src/typings/terminal/reversalRequest.ts index 66504c371..49d059325 100644 --- a/src/typings/terminal/reversalRequest.ts +++ b/src/typings/terminal/reversalRequest.ts @@ -33,21 +33,22 @@ import { CustomerOrder } from './customerOrder'; import { OriginalPOITransaction } from './originalPOITransaction'; import { ReversalReasonType } from './reversalReasonType'; +import { SaleData } from './saleData'; export class ReversalRequest { - 'CustomerOrderID'?: CustomerOrder; + 'SaleData'?: SaleData; 'OriginalPOITransaction': OriginalPOITransaction; - 'ReversalReason': ReversalReasonType; 'ReversedAmount'?: number; - 'SaleReferenceID'?: string; + 'ReversalReason': ReversalReasonType; + 'CustomerOrder'?: CustomerOrder; static discriminator: string | undefined = undefined; static attributeTypeMap: Array<{name: string, baseName: string, type: string}> = [ { - "name": "CustomerOrderID", - "baseName": "CustomerOrderID", - "type": "CustomerOrder" + "name": "SaleData", + "baseName": "SaleData", + "type": "SaleData", }, { "name": "OriginalPOITransaction", @@ -65,9 +66,9 @@ export class ReversalRequest { "type": "number" }, { - "name": "SaleReferenceID", - "baseName": "SaleReferenceID", - "type": "string" + "name": "CustomerOrder", + "baseName": "CustomerOrder", + "type": "CustomerOrder" } ]; static getAttributeTypeMap() {